MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法。
创建第一个用户(该用户需要有grant权限,即:账号管理的授权权限)
1.以非auth认证方式启动数据库: [[email protected] ~]$ mongod --dbpath=/mongodb/data --logpath=/mongodb/log/trace.log --logappend --port=27017 --fork [[email protected] ~]$ mongo MongoDB shell version: 3.2.4 connecting to: test > show dbs local 0.000GB #当前只有一个local库,admin库是不存在的 > 2.在指定的数据库下创建用户 > use admin #帐号是跟着库走的,所以要在指定库里创建用户,必须也在指定库里验证(auth) switched to db admin > db.createUser( ... { ... user: "dba", ... pwd: "dba", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... ); > user: 用户名 pwd: 密码 roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指 定内置角色和用户定义的角色。 role里的角色 可以选: Built-In Roles(内置角色): 1. 数据库用户角色:read、readWrite; 2. 数据库管理角色:dbAdmin、dbOwner、userAdmin; 3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 4. 备份恢复角色:backup、restore; 5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase,userAdminAnyDatabase、dbAdminAnyDatabase 6. 超级用户角色:root 7. 内部角色:__system
刚建立了拥有userAdminAnyDatabase 角色的第一个用户"dba".可以通过这个角色来创建、删除用户
开启auth认证方式启动数据库
[[email protected] ~]$ mongod --dbpath=/mongodb/data --logpath=/mongodb/log/trace.log --logappend --auth --port=27017 --fork [[email protected] ~]$ mongo MongoDB shell version: 3.2.4 connecting to: test > use admin #因为是在admin下面添加的帐号,所以要到admin下面验证(连接)。 switched to db admin > show dbs; 2016-03-27T10:44:27.039-0400 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13 } > db.auth(‘dba‘,‘dba‘); #相当于输入用户名/密码验证(连接) 1 > show dbs; admin 0.000GB local 0.000GB >
创建两个测试用户
> use admin > db.auth(‘dba‘,‘dba‘); > use test #切换到test数据库,这两个用户是在test下创建的 switched to db test > db.createUser( ... { ... user: "polestar", ... pwd: "polestar", ... roles: [{ role: "read", db: "test" }] ... } ... ) > db.createUser( ... { ... user: "polestar_rw", ... pwd: "polestar", ... roles: [ { role: "readWrite", db: "test" }] ... } ... ); > > show users; #test数据库下只有两个用户 { "_id" : "test.polestar", "user" : "polestar", "db" : "test", "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.polestar_rw", "user" : "polestar_rw", "db" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } > > use admin; #admin数据库下只有一个用户 switched to db admin > show users; { "_id" : "admin.dba", "user" : "dba", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } >
有没有一个超级权限?不仅可以授权,而且也可以对集合进行任意操作?答案是肯定的,只是不建议使用。那就是role角色设置成root。
创建超级权限用户
> use admin; switched to db admin > db.auth(‘dba‘,‘dba‘) 1 > db.createUser( ... { ... user: "root", ... pwd: "root", ... roles: [{ role: "root", db: "admin" }] ... } ... ) > > db.auth(‘root‘,‘root‘) #超级用户可以垮裤插入、查询 1 > use test switched to db test > db.abc.insert({"a":1,"b":2}) WriteResult({ "nInserted" : 1 }) > db.abc.find() { "_id" : ObjectId("56f7fa72a219e00610fe75cb"), "a" : 1, "b" : 2 } >
因为帐号都是在当前需要授权的数据库下授权的,那要是不在当前数据库下会怎么样?
> use admin switched to db admin > db.createUser( ... { ... user: "mgdb", ... pwd: "mgdb", ... roles: [{ role: "readWrite", db: "test" }] #在admin库下创建test库的帐号 ... } ... ) > > show users; { "_id" : "admin.dba", "user" : "dba", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } { "_id" : "admin.root", "user" : "root", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] } { "_id" : "admin.mgdb", "user" : "mgdb", "db" : "admin", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } > > use test switched to db test > db.auth(‘mgdb‘,‘mgdb‘); Error: Authentication failed. #在admin下创建的帐号,不能直接在其他库验证, 0 > use admin #只能在帐号创建库下认证,再去其他库进行操作 switched to db admin > db.auth(‘mgdb‘,‘mgdb‘); 1 > use test switched to db test > db.abc.insert({"a":1111,"b":2222}) WriteResult({ "nInserted" : 1 }) >
时间: 2024-10-03 15:01:35