如何对MongoDB 3.2.7进行用户权限管理配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对MongoDB 3.2.7进行用户权限管理配置相关的知识,希望对你有一定的参考价值。

参考技术A 例如:mysql安装配置好后,有一个自带的mysql数据库,里面有一张user表,用来存放用户,以及用户权限,而mongodb这个最像关系型的数据库,有没有这样的表呢。一,掌握权限,理解下面4条基本上就差不多1,mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。2,切换到admin数据库,添加的账号才是管理员账号。3,用户只能在用户所在数据库登录,包括管理员账号。4,管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。这一点比较怪二,添加管理员账号[root@localhost zhangy]# mongoMongoDB shell version: 2.4.6connecting to: tank> use admin //切换到admin数据库switched to db admin> show collections;system.indexessystem.users //用户表> db.system.users.find(); //用户表没有数据> db.addUser('tank','test'); //添加一个管理员账号 "user" : "tank", "readOnly" : false, "pwd" : "988432606980d0695e4f668f6bbc643a", "_id" : ObjectId("529e5d543b6a4608ac833429")三,开启动用户权限认证[root@localhost zhangy]# vim /etc/mongodb.conf //将auth=true前面的注释拿掉[root@localhost zhangy]# /etc/init.d/mongod restart //重启生效四,用户只能在用户所在数据库登录,管理员需要通过admin认证后才能管理其他数据库 [root@localhost zhangy]# mongoMongoDB shell version: 2.4.6connecting to: tank> show dbs; //显示所有数据库失败,因为还没有认证Wed Dec 4 06:39:50.925 listDatabases failed: "ok" : 0, "errmsg" : "unauthorized" at src/mongo/shell/mongo.js:46> db.auth('tank','test'); //认证失败,因为这个用户不属于tank这个数据库Error: 18 code: 18, ok: 0.0, errmsg: "auth fails" 0> use admin //切换到admin数据库switched to db admin> db.auth('tank','test'); //在admin数据库认证成功> use tank; //切换到tank数据库switched to db tank> show collections; //不会在提示没有权限了contactsystem.indexesusers五,添加普通用启> use tank;switched to db tank> db.addUser('tank1','test'); //为tank数据库添加了一个可读写用户tank1 "_id" : ObjectId("529e5f8474b4c660718a70f3"), "user" : "tank1", "readOnly" : false, "pwd" : "35dd47abff098f5b4f0b567db8edeac5"> db.addUser('tank2','test',true); //为tank数据库添加了一个只读用户tank2 "user" : "tank2", "readOnly" : true, "pwd" : "1792916c544d247538ded52e6df7b887", "_id" : ObjectId("529e67553992b24438d5e315")> exit //退出bye[root@localhost zhangy]# mongoMongoDB shell version: 2.4.6connecting to: tank> db.auth('tank1','test'); //刚添加的用户可以登录。六,php客户端连接1, 推荐方法一$mongo = new Mongo(); $db = $mongo->selectDB('tank'); //切换到tank数据库 $db->authenticate("tank3", "test"); //认证 $users= $db->selectCollection("users"); //选取users表 $cursor = $users->find(); //读取数据 foreach ($cursor as $id => $value) echo "$id: "; print_r($value); echo "<br>";这种方式比较好理解,根命令行下的操作过程差不多。2,推荐方法二$mongo = new Mongo("mongodb://tank3:test@127.0.0.1:27017/tank"); //认证用户,这里的数据库,只启认证作用 $db = $mongo->selectDB('tank'); //选取数据库 $users= $db->selectCollection("users"); $cursor = $users->find(); foreach ($cursor as $id => $value) echo "$id: "; print_r($value); echo "<br>";上面二种方法的不同在于,一个先选数据库在认证,一个先认证在选数据库。

我们如何使用带有 expressjs-nodejs 的 mongoose 对 mongodb 中的 ObjectId 列执行排序?

【中文标题】我们如何使用带有 expressjs-nodejs 的 mongoose 对 mongodb 中的 ObjectId 列执行排序?【英文标题】:How we can perform sort on ObjectId column in mongodb using mongoose with expressjs-nodejs? 【发布时间】:2019-02-01 16:07:06 【问题描述】:

我们是一个 mongodb 点的结构,我想在这里描述一下。

我们正在使用 mongoose 5.4 并创建如下模型:

var userSchema = mongoose.Schema(  
id: type: Number, default: 1 ,
first_name: String,
last_name: String,
mail: String,
password: String,
dob:  type: String, default: '' ,
gender:  type: String, default: '' ,
profile_photo:  type: String, default: '' ,
ethnicity:  type: String, default: '' ,
contact_number:  type: String, default: '' ,
user_type: Number,
address1:  type: String, default: '' ,
address2:  type: String, default: '' ,
area:  type: String, default: '' ,
city:  type: String, default: '' ,
country:  type: String, default: '' ,
postcode:  type: String, default: '' ,
business_name:  type: String, default: '' , 
ip_address: String,
status: Number,
tag_line:  type: String, default: '' ,
is_influencer: Number,  
wallet_id: String,
token_balance:  type: Number, default: 0 ,
point_balance:  type: Number, default: 0 ,
badges: [String],
membership:  type: Schema.Types.ObjectId, ref: 'Membership' , 
transaction: [ type: Schema.Types.ObjectId, ref: 'Transaction' ], 
property: [ type: Schema.Types.ObjectId, ref: 'Property' ],   
reviews: [ type: Schema.Types.ObjectId, ref: 'Review' ],
created_date: String,
);

var User = mongoose.model('User', userSchema);

var propertySchema = mongoose.Schema(
id: Number,
property_name: String,
address1: String,
area: String,
post_code: String,
category: [ type: Schema.Types.ObjectId, ref: 'Category' ], 
category_id: [Number],
property_desc: String,
property_images: String,
slug : String,
user_id: Number,
business_key: String,
user:  type: Schema.Types.ObjectId, ref: 'User' ,
reviews: [ type: Schema.Types.ObjectId, ref: 'Review' ],
status: Number,
is_claimed: Number,
created_date: String,
);

var Property = mongoose.model('Property', propertySchema);

var categorySchema = mongoose.Schema(  
id: Number,
category_name: String,
status: Number,
user:  type: Schema.Types.ObjectId, ref: 'User' ,
property: [ type: Schema.Types.ObjectId, ref: 'Property' ],   
created_date: String,
updated_date: String    
);

var Category = mongoose.model('Category', categorySchema);

我们也在这个项目中使用 async-await。我们正在使用以下方法获取位置以获取位置数据以及用户和类别。

sortClause = ;
sortClause.user=parseInt(-1);
let properties = await Property.find('status':$in:[1,2]).populate(path: 'user',
  model: 'User',select: 'first_name last_name mail contact_number').populate(path: 'category',
  model: 'Category',select: 'category_name id').sort(sortClause).skip(skip).limit(perpage).exec();

所以当我们在执行上述行之后在属性对象中获取数据时,我们正在获取属性,但是当我们按用户的属性模型列排序时,它确实正确地获取了数据。它按 objectID 排序,我们想获取用户的 first_name。

我已尝试按排序顺序指定 `'user.first_name':-1,但它根本不起作用。

当我们对字符串或数字列进行排序时,它工作正常,但在这里我的预期结果会有点不同,这里我们想对 user.first_name 应用排序(在上面的示例中,用户是填充用户数据的 ObjectId 列,并且我想对用户的 first_name 列进行排序) 我们如何根据用户的 first_name 列获取属性?有没有针对这个问题的建议。

【问题讨论】:

Mongoose: Sort alphabetically的可能重复 @Shrabanee:很抱歉,但我正在寻找类似的但我的列数据类型是其他模型的 ObjectId,我想在我们完成后对该值的结果(ObjectId 的结果)进行排序填充()。 你试过这个.populate(path: 'user', model: 'User',select: 'first_name last_name mail contact_number', options: sort: 'firstName': -1 ) @AnthonyWinzlet:我们已经使用上述方法进行了检查,但这并没有返回正确的结果。(在填充中使用排序时,我也删除了外部排序,但这也不起作用。) 你得到了什么结果,你期望什么结果?请展示一些演示 【参考方案1】:

您可以尝试以下聚合从 mongodb 3.6 及以上

Property.aggregate([
   "$match":  "status":  "$in": status  ,
   "$lookup": 
    "from": "users",
    "let":  "user": "$user" ,
    "pipeline": [
       "$match":  "$expr":  "$eq": [ "$_id", "$$user" ]   ,
       "$project":  "first_name": 1, "last_name": 1, "mail": 1, "contact_number": 1 
    ],
    "as": "user"
  ,
   "$lookup": 
    "from": "categories",
    "let":  "category": "$category" ,
    "pipeline": [
       "$match":  "$expr":  "$in": [ "$_id", "$$category" ]   ,
       "$project":  "category_name": 1, "id": 1 
    ],
    "as": "category"
  ,
   "$unwind": "user" ,
   "$sort":  "user.first_name": -1 ,
   "$skip": skip ,
   "$limit": perpage 
])

【讨论】:

工作正常,但对 Mongodb 3.4 版进行了切片更改。 let properties = await Property.aggregate([$match : "status": "$in": status , $unwind: "$category" , $lookup: from: "users", localField: "user", foreignField:"_id", as: "user", $lookup: from: "categories", localField: "category", foreignField:"_id", as: "category" , $match: "category": $ne: [] ]).collat​​ion( locale: "en" ).sort('user.first_name':-1).limit(perpage ).exec(); 太棒了!!!但是使用 mongodb 3.6 版本的 $lookup 聚合有很多好处

以上是关于如何对MongoDB 3.2.7进行用户权限管理配置的主要内容,如果未能解决你的问题,请参考以下文章

mongodb权限管理(转)

如何给mongodb管理员权限

MongoDB的权限管理

MongoDB系列---用户及权限管理02

mongodb基础学习6

mongodb权限管理