MongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全,需创建数据库用户。
用户创建语法格式
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [{ role: "<role>",db: "<database>" } | "<role>",] }
- user字段:用户的名字;必填
- pwd字段:用户的密码;必填
- cusomData字段:为任意内容,例如可以为用户全名介绍;
- roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色;必填
- roles 字段,可以指定内置角色和用户定义的角色。必填
#常用角色说明见官方文档
权限角色
飘红为常用角色
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
创建超级管理员
管理所有数据库,必须要进入到admin下创建(use admin),删除时也要到相应的库下操作
mongo #admin下创建用户 use admin db.createUser( {user: "root", pwd: "root", roles: [ { role: "root", db: "admin" } ]} ) #test下创建用户 use test db.createUser( { user: "test", pwd: "test", roles: [ { role: "root", db: "test" } ] } ) #查看用户 show users; #删除用户 > db.dropUser(‘root‘); true > show users;
验证用户存在性
#注:用户创建完成后需在配置文件打开auth验证并重启后生效。
vim /application/mongodb/conf/mongodb1.conf
security:
authorization: enabled
方法1
数据库内验证
> use admin switched to db admin > db.auth("root","root"); 1 #查看系统用户表中数据,查看超管权限只能在admin数据库下进行
#所有用户信息都存储在admin数据库下的system.user中
> db.system.users.find().pretty()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "9ed3ClyZPbThtzzDpqbg9w==", "storedKey" : "QdoewI/2uhUmwjJUbHoPSA+Cleo=", "serverKey" : "pC8yOq1gUaH7a+zIEycElPJINy0=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
方法2
数据库外验证
[mongod@lnmp ~]$ mongo -uroot -proot admin MongoDB shell version: 3.2.8 connecting to: admin
定义指定数据库权限验证 ,只读用户
[mongod@lnmp ~]$ mongo -utest -ptest test > db.createCollection(‘b‘); #创建表 { "ok" : 1 } > show tables; #显示表 b > db.b.insert({"2":"b"}) #插入数据 WriteResult({ "nInserted" : 1 }) > db.b.find().pretty();#格式化打印数据 { "_id" : ObjectId("5a4dd8d22a31eab1f0bbdc67"), "2" : "b" } > db.b.remove({})#删除数据 WriteResult({ "nRemoved" : 1 }) > db.b.find().pretty();
创建对多个数据库的读写权限
use app db.createUser( { user: "app", pwd: "app", roles: [ { role: "readWrite", db: "app" }, { role: "read", db: "test" } ] } ) #app用户登录测试
删除用户
删除登录数据库的用户,需要先use 数据库,再删除它 删除app用户:先登录到admin数据库 # mongo -uroot –proot 10.0.0.131/admin use app db.dropUser("app")
SQL语言与CRUD语言对照
MongoDB CRUD 操作 http://www.mongoing.com/docs/crud.html
schema
SQL Schema Statements |
MongoDB Schema Statements |
CREATE TABLE users ( id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id) ) |
Implicitly created on first insert() operation. The primary key _idis automatically added if _id field is not specified. db.users.insert( { user_id: "abc123", age: 55, status: "A" } ) However, you can also explicitly create a collection: db.createCollection("users") |
ALTER TABLE users ADD join_date DATETIME |
在Collection 级没有数据结构概念。然而在 document级,可以通过$set在 update操作添加列到文档中。 db.users.update( { }, { $set: { join_date: new Date() } }, { multi: true } ) |
ALTER TABLE users DROP COLUMN join_date |
在Collection 级没有数据结构概念。然而在 document级,可以通过$unset 在update操作从文档中删除列。 db.users.update( { }, { $unset: { join_date: "" } }, { multi: true } ) |
CREATE INDEX idx_user_id_asc ON users(user_id) |
db.users.createIndex( { user_id: 1 } ) |
CREATE INDEX idx_user_id_asc_age_desc ON users(user_id, age DESC) |
db.users.createIndex( { user_id: 1, age: -1 } ) |
DROP TABLE users |
db.users.drop() |
插入语句
SQL INSERT Statements |
MongoDB insert() Statements |
INSERT INTO users(user_id, age, status) VALUES ("bcd001", 45, "A") |
db.users.insert( { user_id: "bcd001", age: 45, status: "A" } ) |
查询类
SQL SELECT Statements |
MongoDB find() Statements |
SELECT * FROM users |
db.users.find() |
SELECT id, user_id, status FROM users |
db.users.find( { }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT user_id, status FROM users |
db.users.find( { }, { user_id: 1, status: 1 } ) |
SELECT * FROM users WHERE status = "A" |
db.users.find( { status: "A" } ) |
SELECT user_id, status FROM users WHERE status = "A" |
db.users.find( { status: "A" }, { user_id: 1, status: 1, _id: 0 } ) |
数据更新操作
SQL Update Statements |
MongoDB update() Statements |
UPDATE users SET status = "C" WHERE age > 25 |
db.users.update( { age: { $gt: 25 } }, { $set: { status: "C" } }, { multi: true } ) |
UPDATE users SET age = age + 3 WHERE status = "A" |
db.users.update( { status: "A" } , { $inc: { age: 3 } }, { multi: true } ) |
数据删除操作
SQL Delete Statements |
MongoDB remove() Statements |
DELETE FROM users WHERE status = "D" |
db.users.remove( { status: "D" } ) |
DELETE FROM users |
db.users.remove({}) |