MongoDB数据库的用户管理与SQL语言对比
MongoDB中用户管理
MongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全,需创建数据库用户。
1.6.1 用户的权限
用户中权限的说明
权限 | 说明 |
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 |
root | 只在admin数据库中可用。超级账号,超级权限 |
更多关于用户权限的说明参照:https://docs.mongodb.com/manual/core/security-built-in-roles/
用户创建语法
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
语法说明:
user字段:用户的名字;
pwd字段:用户的密码;
cusomData字段:为任意内容,例如可以为用户全名介绍;
roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色;
roles 字段:可以指定内置角色和用户定义的角色。
1.6.2 创建管理员用户
进入管理数据库
> use admin
创建管理用户,root权限
db.createUser( { user: "root", pwd: "root", roles: [ { role: "root", db: "admin" } ] } )
注意:
创建管理员角色用户的时候,必须到admin下创建。
删除的时候也要到相应的库下操作。
查看创建完用户后的collections;
> show tables; system.users # 用户存放位置 system.version
查看创建的管理员用户
> show users { "_id" : "admin.root", "user" : "root", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] }
验证用户是否能用
> db.auth("root","root") 1 # 返回 1 即为成功
用户创建完成后在配置文件中开启用户验证
cat >>/application/mongodb/conf/mongod.conf<<-'EOF' security: authorization: enabled EOF
重启服务
/etc/init.d/mongod restart
登陆测试,注意登陆时选择admin数据库
注意:用户在哪个数据库下创建的,最后加上什么库。
方法一:命令行中进行登陆
[mongod@MongoDB ~]$ mongo -uroot -proot admin MongoDB shell version: 3.2.8 connecting to: admin >
方法二:在数据库中进行登陆验证:
[mongod@MongoDB ~]$ mongo MongoDB shell version: 3.2.8 connecting to: test > use admin switched to db admin > db.auth("root","root") 1 > show tables; system.users system.version
1.6.3 按生产需求创建应用用户
创建对某库的只读用户
在test库创建只读用户test
use test db.createUser( { user: "test", pwd: "test", roles: [ { role: "read", db: "test" } ] } )
测试用户是否创建成功
db.auth("test","test") show users;
登录test用户,并测试是否只读
show collections; db.createCollection('b')
创建某库的读写用户
创建test1用户,权限为读写
db.createUser( { user: "test1", pwd: "test1", roles: [ { role: "readWrite", db: "test" } ] } )
查看并测试用户
show users; db.auth("test1","test1")
创建对多库不同权限的用户
创建对app为读写权限,对test库为只读权限的用户
use app db.createUser( { user: "app", pwd: "app", roles: [ { role: "readWrite", db: "app" }, { role: "read", db: "test" } ] } )
查看并测试用户
show users db.auth("app","app")
删除用户
删除app用户:先登录到admin数据库
mongo -uroot –proot 127.0.0.1/admin
进入app库删除app用户
use app db.dropUser("app")
1.6.4 自定义数据库
创建app数据库的管理员:先登录到admin数据库
use app db.createUser( { user: "admin", pwd: "admin", roles: [ { role: "dbAdmin", db: "app" } ] } )
创建app数据库读写权限的用户并具有clusterAdmin权限:
use app db.createUser( { user: "app04", pwd: "app04", roles: [ { role: "readWrite", db: "app" }, { role: "clusterAdmin", db: "admin" } ] } )
1.7 SQL与MongoDB语言对比
SQL语言与CRUD语言对照
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 Statements | MongoDB Statements |
INSERT INTO users(user_id, age status) VALUES ("bcd001", 45, "A") | db.users.insert( { user_id: "bcd001", age: 45, status: "A" } ) |
DELETE FROM users WHERE status = "D" | db.users.remove( { status: "D" } ) |
DELETE FROM users | db.users.remove({}) |
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 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 } ) |
1.8 错误解决
在登陆数据库的时候,发现会由描述文件相关的报错。
[mongod@MongoDB mongodb]$ mongo MongoDB shell version: 3.2.8 connecting to: test Server has startup warnings: 2018-01-03T11:08:55.526+0800 I CONTROL [initandlisten] 2018-01-03T11:08:55.526+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 19193 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
解决办法:
cat >> /etc/security/limits.conf <<EOF mongod soft nofile 32767.5 mongod soft nproc 32767.5 EOF
修改后,重启服务器,即可解决该问题。
1.9 参考文献
[1] https://docs.mongodb.com/manual/introduction/
[2] http://www.mongoing.com/docs/introduction.html
[4] https://docs.mongodb.com/manual/core/security-built-in-roles/
作者:惨绿少年
出处:http://clsn.io
目录 返回
首页