此文章主要记录部分主要的 MongoDB 的 DCL 操作。
MongoDB 默认不需要用户名和密码就可以用 mongodb.exe 登录
一、开启 MonogoDB 的权限模式
修改 MongoDB 服务的注册语句,修改加入 –auth 参数,详情见MongoDB 入门之安装篇
"$MONGODB_HOME\bin\mongod.exe" --config "$MONGODB_HOME\mongo.cfg" --install --auth
C:\Windows\System32\sc.exe create MongoDB binPath= "\"$MONGODB_HOME\bin\mongod.exe\" --service --auth --config=\"$MONGODB_HOME\mongo.cfg\"" DisplayName= "MongoDB 2.6 Standard" start= "auto"
或者在mongod.cfg 中添加配置
auth=true
二、用户权限管理
- 创建用户
> db.addUser("user","abc123_") WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead Successfully added user: { "user" : "user", "roles" : [ "dbOwner" ] } >
可以看到当执行 addUser 命令是出现 wraning,虽然创建成功了,但是 MongoDB 建议使用 createUser。
> db.createUser({ ... user:"user", ... pwd:"abc123_", ... roles:[ ... { ... role:"dbOwner", ... db:"mydb" ... } ... ] ... }) Successfully added user: { "user" : "user", "roles" : [ { "role" : "dbOwner", "db" : "mydb" } ] } >
如果 MongoDB 开启了权限模式,并且某一个数据库没有任何用户时,在不验证权限的情况下,可以创建一个用户,当继续创建第二个用户时,会返回错误,若想继续创建用户则必须登录。
2014-10-16T10:40:41.904+0800 Error: couldn't add user: not authorized on mydb to execute command { createUser: "test", pwd: "xxx", roles: [ { role: "dbOwner", db: "mydb" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } } at src/mongo/shell/db.js:1004 >
创建超级管理员
创建超级管理员需要未开启权限模式的情况下执行。如果已开启权限而在 admin 下创建超级管理员,会出现如下错误> db.createUser({ ... user:"admin", ... pwd:"admin", ... roles:[ ... { ... role:"userAdminAnyDatabase", ... db:"admin" ... } ... ] ... }) 2014-10-16T10:48:01.223+0800 Error: couldn't add user: not authorized on admin to execute command { createUser: "admin", pwd: "xxx", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } } at src/mongo/shell/db.js:1004 >
关闭权限模式创建超级管理员
> use admin switched to db admin > db.createUser({ ... user:"admin", ... pwd:"admin", ... roles:[ ... { ... role:"userAdminAnyDatabase", ... db:"admin" ... } ... ] ... }) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } >
如果使用 addUser 创建超级管理员还必须切换到 admin 数据库。
- 删除用户
> db.dropUser("user") true >
- 登录
anth 需要登录用户有该数据库的权限> use mydb switched to db mydb > db.auth("user","abc123_") 1 >