教你如何利用MySQL学习MongoDB之授权和权限

在上文中,我们了解了教你如何利用MySQL学习MongoDB之SQL语法,本文中我们继续我们的学习之旅,学习两者的授权和权限。

数据库的安全性是每一个DBA重点关注的部分,在数据库建立之后,数据的安全就显得尤为重要。

对于一个数据库管理员来说,安全性就意味着他必须保证那些具有特殊数据访问权限的用户能够登录到数据库服务器,并且能够访问数据以及对数据库对象实施各种权限范围内的操作;同时,DBA还要防止所有的非授权用户的非法操作。

1、MySQL授权和权限

MySQL中有两种级别的权限:管理和用户。所有权限都可分别使用 GRANT 和 REVOKE 语句授予和收回。可以授予用户create、select、update、delete、insert、execute、index 等权限,也可授予alter、drop和shutdown等系统权限。根用户root在默认情况下具有所有权限。

2、MongoDB授权和权限

官方文档开启MongoDB 服务时不添加任何参数时,可以对数据库任意操作,而且可以远程访问数据库,所以推荐只是在开发是才这样不设置任何参数。如果启动的时候指定–auth参数,可以从阻止根层面上的访问和连接

(1)、只允许某ip访问

mongod –bind_ip 127.0.0.1

(2)、指定服务端口

mongod –bind_ip 127.0.0.1 –port27888

(3)、添加用户认证

mongod –bind_ip 127.0.0.1 –port27888 –auth

(4)、添加用户

在刚安装完毕的时候MongoDB都默认有一个admin数据库,而admin.system.users中将会保存比在其它数据库中设置的用户权限更大的用户信息。

当admin.system.users中一个用户都没有时,即使mongod启动时添加了–auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作,直到在admin.system.users中添加了一个用户。

下面分别创建两个用户, 在foo中创建用户名为user1密码为pwd1的用户,如下:

  1. [root@localhost bin]# ./mongo --port 27888   
  2. MongoDB shell version: 1.8.1   
  3. connecting to: test   
  4. > use foo   
  5. switched to db foo   
  6. > db.addUser("user1","pwd1")   
  7. {   
  8. "user" : "user1",   
  9. "readOnly" : false,   
  10. "pwd" : "35263c100eea1512cf3c3ed83789d5e4"   
  11. }  

 

[[29688]]

在admin中创建用户名为root密码为pwd2的用户,如下:[[29688]]

 

  1. > use admin   
  2. switched to db admin   
  3. > db.addUser("root""pwd2")   
  4. {   
  5. "_id" : ObjectId("4f8a87bce495a88dad4613ad"),   
  6. "user" : "root",   
  7. "readOnly" : false,   
  8. "pwd" : "20919e9a557a9687c8016e314f07df42"   
  9. }   
  10. > db.auth("root""pwd2")   
  11. 1   
  12. >  

 

如果认证成功会显示1, 用以下命令可以查看特定的数据库的用户信息:[[29688]]

  1. > use admin   
  2. switched to db admin   
  3. > db.system.users.find();   
  4. "_id" : ObjectId("4f8a87bce495a88dad4613ad"), "user" : "root""readOnly" : false"pwd" : "20919e9a557a9687c8016e314f07df42" }   
  5. > use foo   
  6. switched to db foo   
  7. > db.system.users.find();   
  8. "_id" : ObjectId("4f92966d77aeb2b2e730c1bb"), "user" : "user1""readOnly" : false"pwd" : "35263c100eea1512cf3c3ed83789d5e4" }   
  9. >  

 

下面我们试验一下用户的权限设置是否正确:[[29688]]

  1. [root@localhost bin]# ./mongo --port 27888   
  2. MongoDB shell version: 1.8.1   
  3. connecting to: 127.0.0.1:27888/test   
  4. > use foo   
  5. switched to db foo   
  6. > db.system.users.find();   
  7. error: {   
  8. "$err" : "unauthorized db:foo lock type:-1 client:127.0.0.1",   
  9. "code" : 10057   
  10. }   
  11. > use admin   
  12. switched to db admin   
  13. > db.system.users.find();   
  14. error: {   
  15. "$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",   
  16. "code" : 10057   
  17. }   
  18. >  

 

通知以上实验结果,说明登录时不指定用户名和口令时会报错,也就是说安全性的部署生效了。下面我再看一下另一个场景:

  1. [root@localhost bin]# ./mongo --port 27888 -uroot -ppwd2   
  2. MongoDB shell version: 1.8.1   
  3. connecting to: 127.0.0.1:27888/test   
  4. Sat Apr 21 19:23:15 uncaught exception: login failed   
  5. exception: login failed  

 

奇怪了,我们明明指定了用户名而且口令也没有错呀,这时我们看一下系统日志上是否有一些有价值的信息:

auth: couldn’t find user root, test.system.users

 

哦,原来是这样,说明连接mongodb时,如果不指定库名,那么会自动连接到test库,但刚才我们新建的用户,都不是在test库上建立的,所以我们需要显示指定需要连接的库名:

  1. [root@localhost bin]# ./mongo --port 27888 admin -uroot -ppwd2   
  2. MongoDB shell version: 1.8.1   
  3. connecting to: 127.0.0.1:27888/admin   
  4. > show collections;   
  5. system.indexes   
  6. system.users   
  7. > use foo   
  8. switched to db foo   
  9. > show collections   
  10. system.indexes   
  11. system.users   
  12. t1   
  13. >  

 

可以看到root这个用户有所有库的操作权限, 那么user1这个用户有什么权限呢?我们一试便知:

  1. [root@localhost bin]# ./mongo --port 27888 foo -uuser1 -ppwd1   
  2. MongoDB shell version: 1.8.1   
  3. connecting to: 127.0.0.1:27888/foo   
  4. > show collections;   
  5. system.indexes   
  6. system.users   
  7. t1   
  8. > use test   
  9. switched to db test   
  10. > show collections   
  11. Sat Apr 21 19:28:25 uncaught exception: error: {   
  12. "$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",   
  13. "code" : 10057   
  14. }   
  15. >  

 

通过结果我们看到, 由于user1是在foo库里建立的用户,所以它不具有操作其它数据库,甚至是test库的权限。

 

【编辑推荐】

  1. 教你如何利用MySQL学习MongoDB之SQL语法
  2. 教你如何利用MySQL学习MongoDB之数据存储结构
  3. 如何解决PHP+MySQL出现乱码的现象
  4. 教你如何利用MySQL学习MongoDB之安装篇
  5. MySQL配置时提示无法连接到MySQL本地服务器

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/261387.html<

(0)
运维的头像运维
上一篇2025-05-03 15:00
下一篇 2025-05-03 15:02

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注