Nodejs 用户权限管理,mongodb结构设计问题

Nodejs 用户权限管理,mongodb结构设计问题

想做权限管理,传统关系数据库,用户表,角色表,权限表,模块表,分的很细。这准备改为mongodb,有点傻了,是该将所有权限做在一张表里还是分开。 把权限,模块做成用户的一个子集合,如用户{模块,权限,操作},这种形式,可行,但感觉有些怪,大家一般怎么设计表?

3 回复

Node.js 用户权限管理与 MongoDB 结构设计

在传统的关系型数据库中,用户权限管理通常涉及多个表(如用户表、角色表、权限表、模块表等)。而在使用 NoSQL 数据库如 MongoDB 时,我们可以采用更灵活的方式来设计这些结构。以下是一些常见的设计思路和示例代码。

设计思路

  1. 扁平化结构:将所有权限信息存储在一个文档中,这样可以简化查询逻辑。
  2. 嵌套结构:将权限、模块作为用户文档中的子文档或数组。

示例代码

假设我们有一个 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 };

总结

  • 嵌入式文档:适用于数据量较小且不经常修改的情况。
  • 引用式文档:适用于数据量较大且需要频繁修改的情况。

选择哪种方案取决于具体的应用场景和需求。

回到顶部