Nodejs 用户权限管理,mongodb结构设计问题
Nodejs 用户权限管理,mongodb结构设计问题
想做权限管理,传统关系数据库,用户表,角色表,权限表,模块表,分的很细。这准备改为mongodb,有点傻了,是该将所有权限做在一张表里还是分开。 把权限,模块做成用户的一个子集合,如用户{模块,权限,操作},这种形式,可行,但感觉有些怪,大家一般怎么设计表?
Node.js 用户权限管理与 MongoDB 结构设计
在传统的关系型数据库中,用户权限管理通常涉及多个表(如用户表、角色表、权限表、模块表等)。而在使用 NoSQL 数据库如 MongoDB 时,我们可以采用更灵活的方式来设计这些结构。以下是一些常见的设计思路和示例代码。
设计思路
- 扁平化结构:将所有权限信息存储在一个文档中,这样可以简化查询逻辑。
- 嵌套结构:将权限、模块作为用户文档中的子文档或数组。
示例代码
假设我们有一个 User
模型,其中包含用户的基本信息以及权限信息。
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 定义权限模型
const PermissionSchema = new Schema({
module: String, // 模块名
actions: [String] // 可执行的操作
});
// 定义用户模型
const UserSchema = new Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
roles: [String], // 角色列表
permissions: [PermissionSchema] // 权限列表
});
// 创建模型
const User = mongoose.model('User', UserSchema);
module.exports = User;
使用示例
创建一个新用户并赋予其权限:
const newUser = new User({
username: 'john_doe',
password: 'securepassword',
roles: ['admin'],
permissions: [
{
module: 'dashboard',
actions: ['read', 'write']
},
{
module: 'settings',
actions: ['read']
}
]
});
newUser.save((err) => {
if (err) console.error(err);
else console.log('User created successfully!');
});
查询用户权限:
User.findOne({ username: 'john_doe' }, (err, user) => {
if (err) console.error(err);
else {
console.log(user.permissions);
// 输出:
// [
// { module: 'dashboard', actions: [ 'read', 'write' ] },
// { module: 'settings', actions: [ 'read' ] }
// ]
}
});
总结
在 MongoDB 中,你可以选择将所有权限信息嵌入到用户文档中,也可以通过引用其他文档来实现。这取决于你的具体需求和应用场景。上述示例展示了如何将权限信息嵌入到用户文档中,并提供了基本的增删改查操作。希望这能帮助你更好地理解和设计用户权限管理系统。
挂在用户对象里
在MongoDB中进行用户权限管理时,可以采用嵌入式文档(Embedded Documents)或引用式文档(Referenced Documents)的方式。以下是两种常见的设计方案。
方案一:嵌入式文档
在这种方案中,用户文档包含了模块、权限和操作信息。这种方式适用于数据量不大且相对静态的情况。
示例代码:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: { type: String, required: true },
password: { type: String, required: true },
roles: [{
name: String,
modules: [{
moduleName: String,
permissions: [String]
}]
}]
});
const User = mongoose.model('User', userSchema);
module.exports = User;
方案二:引用式文档
在这种方案中,用户、角色、模块和权限分别存储在不同的集合中,并通过引用关联起来。这种方式适用于数据量较大且需要频繁修改的情况。
示例代码:
const mongoose = require('mongoose');
const roleSchema = new mongoose.Schema({
roleName: { type: String, required: true },
modules: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Module' }]
});
const moduleSchema = new mongoose.Schema({
moduleName: { type: String, required: true },
permissions: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Permission' }]
});
const permissionSchema = new mongoose.Schema({
permissionName: { type: String, required: true }
});
const userSchema = new mongoose.Schema({
username: { type: String, required: true },
password: { type: String, required: true },
roles: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Role' }]
});
const Role = mongoose.model('Role', roleSchema);
const Module = mongoose.model('Module', moduleSchema);
const Permission = mongoose.model('Permission', permissionSchema);
const User = mongoose.model('User', userSchema);
module.exports = { User, Role, Module, Permission };
总结
- 嵌入式文档:适用于数据量较小且不经常修改的情况。
- 引用式文档:适用于数据量较大且需要频繁修改的情况。
选择哪种方案取决于具体的应用场景和需求。