MongoDB记录(坑在末尾)
Mongo数据库基本配置
基本配置
基本配置包括
1.端口号:默认27017
,安全性较低
2.数据库文件位置
3.日志文件位置
4.日志写入模式
5.密码认证
6.后台运行
配置文件如下
# 文件名 mongodb.conf
# 修改默认端口,
port=27999
# 数据库位置
dbpath=/data/db
# 日志文件位置
logpath=/data/log/mongodb.log
# 设置为后台运行
fork=true
# 默认为覆盖,设置为追加
logappend=true
# 是否开启认证
auth=false
运行mongod --config /usr/local/mongodb/mongodb.conf
,登录时mongo --port=27999
指定配置里的端口才能登录
这样,无密码的后台运行的 mongodb 就启动了。
注意:
错误:ERROR: child process failed, exited with error number 1
原因:错误代码为1是因为配置文件缺失,如上配置即是目录文件缺失,需要将日志路径指定为一个文件,而不是文件夹,一开始配置可以指定为文件夹,我是后面追加配置的,所以指定文件才能运行。
密码配置
以上配置没有密码认证,这样数据的安全性得不到保障,所以最好添加密码
需要用到的命令
use admin
db.createUser({user:"root",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
无密码状态下登录MongoDB
服务器,进入admin
数据库,运行db.creatUser({user:'root', pwd:"123456", roles:[{role:"userAdminAnyDatabase", db:"admin"}]})
添加相应的用户名跟密码以及相应的权限
先kill
掉原来的进程,再更改配置,再次运行(现在配置如下,即将auth
改成true
)
# 修改默认端口
port=27999
# 数据库位置
dbpath=/data/db
# 日志文件位置
logpath=/data/log/mongodb.log
# 设置为后台运行
fork=true
# 默认为覆盖,设置为追加
logappend=true
# 开启认证
auth=true=
登录步骤
1.运行这步就不用说了,基本配置里有
2.进入admin
数据库,即use admin
3.运行db.auth('root', '123456')
进行验证,成功为1,失败为0
PyMongo认证
分两种认证,如配置一样,即不带密码和带密码,取决于数据库是否设置了密码
不带密码的认证
不密码的直接上代码
from pymongo import MongoClient
# 不带密码的直接上 ip地址 和 端口号
client = MongoClient("localhost", 27999)
带密码的认证
带密码认证需要根据不同版本的数据库来选择
先上一张图
以上图片是pymongo
中authenticate()
认证函数的参数说明
鉴于英语不好,google翻译一张
简单的来说,取决于参数mechanism
- 默认
MONGODB-CR
来连接3.0 - 往后的则使用
SCRAM-SHA-1
来连接3.0-3.6,和4.0+
因为我的是4.0.4
,所以我使用SCRAM-SHA-1
注意:要先切换到admin
数据库,否则会报错pymongo.errors.OperationFailure: Authentication failed.
代码如下
from pymongo import MongoClient
client = MongoClient("localhost", 27999)
admin = client.admin
admin.authenticate("root", "123456", mechanism='SCRAM-SHA-1')
你以为这样就搞定了吗?不
以上的密码的用户是管理员用户,具体可进去参考资料之权限说明看
在admin数据库下为kencery用户建立了一个userAdminAnyDatabase角色,使用这个用户来管理用户,可以通过这个角色来创建、删除角色
但是这个用户无法在其他数据库进行读写操作,提示错误not authorized on web to execute command
,即使我在admin
认证了root
用户,仍不行,所以我切换到数据库新创一个用户
use web
db.createUser({user:'web', pwd:'web', roles:[{role:'readWrite', db:'web'}]})
用pymongo登录的时候,使用该用户(不用登录root
),即可对该数据库进行读写操作。如果命令行登录mongo
提示认证用户过多,退出重登就行(原因可能是刚才登录了root
所致)
from pymongo import MongoClient
client = MongoClient("localhost", 27999)
admin = client.admin
admin.authenticate("web", "web", mechanism='SCRAM-SHA-1')