MongoDB认证和授权

2017.09.18 19:04:25字数 1174阅读 772

要想了解MongoDB的权限必须先了解如下一些关键字:

user:

用户,用于提供客户端连接MongoDB的认证账户;

role:

角色,数据权限的集合,创建用户的时候必须要指定对应的角色,否则用户无法操作数据库;

resource:

资源,包括database或collection 也可以是database和collection的组合;

如 {db:, collection:}

actions:

权限操作,定义了 user 能够对 resource document 执行的操作;

如 增、删、改、查;

privilege:

权限,privilege 是一组 resource 和 action的组合,对资源拥有什么操作称为权限;

authenticationDatabase:

认证库,及创建角色或用户时所在的库;

如,在admin下创建MongoDB用户那么登录的时候需要指定认证库 admin;

在 test 库下创建的用户登录的时候指定认证库 test;

权限认证

MondoDB单实例认证

MongodDB存储所有的用户信息在admin数据库的集合system.users中,保存数据库、密码和数据库信息。MongoDB默认不启用权限认证,只要能连接到服务器,就可连接到mongod。

若要启用安全认证,需要更改配置文件Authorization,也可简写为 auth。或者在命令行启动MongoDB时加上 -auth参数启动,这样当MongoDB启动后就需要用户和密码进行认证了。

这是老版本MongoDB2.x中:

vim /etc/mongod.conf

auth = true

MongoDB3.x中:

vim /etc/mongod.conf

security:

authorization:enabled

但是,不使用用户名和密码依然可以连接到数据库。但是将没有权限查看数据库。这里可以认证用户:

mongo

use 库(如admin)

db.auth("user","pwd")

或直接 mongo 127.0.0.1/admin -u user -p 来连接数据库。

在MongoDB授权部分,其中admin数据库中的用户名可以管理所有的数据库,其他数据库中的用户只能管理其所在的数据库。

MongoDB副本集认证

如果在副本集机制下开启了 -auth 认证,那么此时MongoDB副本集状态就会变成不健康状态,这就需要另外一个认证方式 KeyFile 。

简单来说 KeyFile 就是用在副本集群间开启认证的情况下需要的另一种认证方式,用来验证集群间身份的。

在各个节点的配置文件中加入KeyFile(600):

vim /etc/mongod.conf

security:

authorization:enabled

KeyFile:/path/.KeyFile

在副本集模式下,在整个配置完成前不要创建任何用户,当认证好了之后,就可以创建用户了。

角色管理

MondoDB支持基于角色的访问控制(RBAC)来管理对MongoDB系统的访问。一个用户可以被授权一个或多个角色以决定该用户对数据库资源和操作的访问权限。在权限以外,用户是无法访问系统的。

数据库角色在创建用户的role参数中设置。角色分为內建角色和自定义角色。

內建角色

MongoDB內建角色包括以下几类:

1. 数据库用户角色

read:允许用户读取指定数据库;

readWrite:允许用户读写指定数据库;

2. 数据库管理员角色

dbAdmin:允许用户进行索引创建、删除,查看统计或访问system.profile,但没有角色和用户管理的权限;

userAdmin:提供了在当前数据库中创建和修改角色和用户的能力;

dbOwner:提供对数据库执行任何操作的能力。这个角色组合了readWrite、dbAdmin和userAdmin角色授权的特权;

3. 集群管理角色

hostManager:提供监视和管理服务器的能力;

clusterManager:在集群上提供管理和监视操作。可以访问配置和本地数据库,这些数据库分别用于分片和复制;

clusterMonitor:提供对监控工具的只读访问;

clusterAdmin:提供最强大的集群管理访问(副本集、分片、主从等)。组合了clusterManager、clusterMonitor和hostManager角色的能力,还提供了dropDatabase操作;

4. 备份恢复角色

backup:提供备份数据所需的能力;

restore: 提供使用mongorestore恢复数据的能力;

5. 所有数据库角色

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限;

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限;

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限;

dbAdminAnyDataBase:只在admin数据库中可用,赋予用户所有数据库的adAdmin权限;

6. 超级用户角色

root:超级权限,只能针对admin库;

7. 内部角色

__system:提供对数据库中任何对象的任何操作的特权;

自定义角色

MongoDB内置角色一般来说都是够用的,但当内置角色不满足需求时就可以自定义角色了。使用 db.createRole() 方法来自定义角色。

只能在 admin库 中创建角色;

use admin

db.createRole(

{

role:, #定义角色名称

privilege:[ #权限集

{resource:{cluster:true, actions:[]},

{resource: {db:, collection:},

actions:[]} #定义对这个库或集合可进行的权限操作,这是一个数组

],

roles:[{role:, db:}] #是否继承其他的角色

角色创建完毕后 MongoDB 会在系统库 admin 下创建一个系统 collection 名叫 system.roles,里面存储的即是角色相关的信息。使用如下命令查看:

db.system.roles.find()

操作角色

查看角色

db.getRole()

角色继承

db.grantRolesToRole() #角色授权

db.revokeRolesfromRole() #角色移权

用户管理

创建用户

db.createUser({

user:"xxx", pwd:"xxxx", customDate:"xxx",

roles:[{ #指定角色名称以及认证库

role:"xxx", db:"xxxx"

}]

})

认证

vim /etc/mongo.conf

security:

authorization:enabled

db.auth("user","passwd") #在use db后

mongo -u user -p passwd --authenticationDatabase xxx

#在哪个库创建的用户就需要使用哪个库进行认证

查看用户

db.getUser("user")

db.system.users.find()

删除用户

db.dropUser("user")

db.dropAllUsers() #删除当前库所有用户

添加用户权限

db.grantRolesToUser()

修改密码

db.changeUserPassword("user","new_passwd")

关闭MongoDB,千万不要 kill -9 pid,使用 db.shutdownServer()。

在MongoDB中删除库和集合并不会级联删除对应的角色和用户。因此如果想彻底删除对应的业务应该先删除库与其对应的角色和用户。

如果既想实现精细化权限控制又想简化用户管理,原则上建议只给开发创建一个账户,并且使用admin做认证库,这样可以避免清理过期业务库而导致无法登陆的问题。

2人点赞

mongodb java报授权,MongoDB认证和授权相关推荐

  1. mongodb java报授权,mongoDB 3.0用户创建与授权

    选择数据库 use admin 添加用户: db.createUser( { user: "admin", pwd: "12345678", roles: [ ...

  2. 记录MongoDB启动报错MongoDB not running on the provided host and port

    Error1,未启动MongoDB数据库 创立文件夹db,路径为D:\db\MongoDB win+r打开cmd命令行,cd到D:\Program Files\MongoDB\Server\4.1\b ...

  3. mongodb java geo_基于MongoDB位置查询GEO信息

    MongoDB目前支持二维的地图查询,查询区域包括圆形与矩形,距离单位包括MILES,KILOMETERS,NEUTRAL,下面的示例演示距离单位为NEUTRAL,而实际生产应用中则会用到MILES与 ...

  4. java 安全 认证和授权,Java安全之认证与授权

    Java平台提供的认证与授权服务(Java Authentication and Authorization Service (JAAS)),能够控制代码对敏感或关键资源的访问,例如文件系统,网络服务 ...

  5. Service Mesh架构下的认证与授权

    认证与授权几乎是所有系统必不可少要处理的问题.在传统架构下,我们习惯了在程序中写一些代码或引一些类库来处理其相关的逻辑,但如果在Service Mesh架构下,会有什么不同? Service Mesh ...

  6. java安全 ——JAAS(Java 认证和授权服务)开发指南

    以下内容转自: http://lyb520320.iteye.com/blog/720478 [0]README 1)本文翻译自:http://java.sun.com/developer/techn ...

  7. Java会话加密_shiro的认证、授权、会话、加密

    shiro shiro是一个基于java的开源的安全管理框架,可以完成认证,授权,会话管理,加密,缓存功能. 为什么学习shiro 在java的世界中,安全管理框架有spring security和s ...

  8. java权限管理+授权与认证_权限管理(认证和授权)

    什么是权限管理 基本涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理 ...

  9. mongodb java连接 集群_java连接mongodb集群

    MongoDb 的分片拓展与副本集 Mongodb 数据库分片是通过并行处理数据实现负载均衡的一种重要手段[12],同时也是数据库集群 实现分布式计算的关键技术.在生产环境中,...... 本地数据访 ...

  10. 使用Shell和Java驱动程序的MongoDB身份验证配置示例

    Authentication enables user to verify identity before connecting to the database. At first, a user w ...

最新文章

  1. Linux基础—screen命令
  2. sqlitepython导入数据_python从sqlite读取并显示数据的方法
  3. JNI线程、Linux常用命令、权限、防火墙配置
  4. 一个简单可参考的API网关架构设计
  5. 经典C语言程序100例之九七
  6. 带有下标的赋值维度不匹配_KDD 2019|?结构感知的神经网络对人才-组织匹配的影响...
  7. Apache Rewrite实现URL的301跳转和域名跳转
  8. java发送163邮件
  9. c语言一元多项式求和
  10. tableau最大值最小值显示
  11. 新版白话空间统计(25):方向分布(标准差椭圆)
  12. 使用OneR算法进行分类(Python实现)
  13. Excel-RANK函数排名与拓展
  14. 插板法、插空法、捆绑法
  15. 玫琳凯携手联合国机构推出女性创业加速器计划
  16. bc vc投资_【融资系列】 VC投资中的常见分期追加投资
  17. 为什么嫁人要嫁IT男?
  18. 【HaaS Python硬件积木】土壤湿度传感器
  19. 世界女性科技群落(三):全世界最幸福的地方,女性和科技的月之暗面
  20. 英语知识点整理day05-各国货币表达

热门文章

  1. codis实现redis分片和在线扩展
  2. 有关Select 语句查询.四
  3. [BZOJ4540][HNOI2016]序列(莫队)
  4. 常用tab选项卡代码
  5. [转] NOI, NOIP, IOI, ACM
  6. shell脚本命令行参数里的空白符
  7. Linux CentOS 7 JDK7 Tomcat7 的配置
  8. JSON 之 SuperObject(8): 关于乱码的几种情况 - 向 Henri Gourvest 大师报告
  9. Google之海量数据的交互式分析工具Dremel
  10. Arcgis for Js实现graphiclayer的空间查询(续)