实现用户权限

时间:2017-01-20 14:39:46

标签: node.js mongodb mongoose permissions

我正在使用NodeJS(使用TypeScript)和MongoDB(使用mongoose)构建Web应用程序。

在我的应用程序中,我有6种类型的权限。 为简单起见,我们使用P1,P2,...,P6来表示我的权限。

此外,该应用程序有几个组织。

应用程序中的每个用户都属于一个组织,并且每个组织可以拥有多个权限(P1-P6)(不一定是他所属的组织)。

例如:

  • 用户'U1'属于'O1'组织,在组织'O1'中具有权限P1,P3和权限 组织'O2'中的P2,P6。
  • 用户'U2'属于'O2'组织,在组织'O2'中拥有权限P1。
  • 用户'U3'属于'O1'组织,没有权限。

我正在尝试在用户模式中实现此结构(使用mongoose模式),并且需要一些关于我的实现的意见。

这是我的用户架构:

var userSchema: mongoose.Schema = new mongoose.Schema({
    _id: {
        type: String
    },
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    mail: {
        type: String,
        required: true,
        unique: true
    },
    organization: { // User's organization
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Organization'
    },
    permissions: [{
        organization: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Organization'
        }, 
        permissions: [{
            type: String,
            enum: [
                Permission.P1,
                Permission.P2,
                Permission.P3,
                Permission.P4,
                Permission.P5,
                Permission.P6,
            ]
        }]
    }]
});

对于我使用的权限枚举:

export enum Permission {
    P1 = <any>'P1',
    P2 = <any>'P2',
    P3 = <any>'P3',
    P4 = <any>'P4',
    P5 = <any>'P5',
    P6 = <any>'P6',
}

我将此枚举用作字符串值,因为我认为拥有权限的字符串值而不仅仅是枚举数值(1-6)更好。 当然,权限名称(P1-P6)将替换为实际权限名称 - 例如P1为Administrator。

我不确定我目前的实施情况,并希望得到一些意见,无论我做得好还是应该改变一些事情。

请随意批评我的代码和思维方式。

谢谢,

罗恩。

2 个答案:

答案 0 :(得分:0)

您也可以直接在userSchema上添加角色。这样的事情呢?除非每个组织都要定制他们的权限?

var userSchema = new mongoose.Schema({ _id: { type: String }, firstName: { type: String, required: true }, lastName: { type: String, required: true }, mail: { type: String, required: true, unique: true }, organization: { // User's organization type: mongoose.Schema.Types.ObjectId, ref: 'Organization' }, admin :{type:Boolean}, superAdmin :{type:Boolean}, globalAdmin :{type:Boolean} })

答案 1 :(得分:0)

您可能会对CASL感兴趣。您可以在Expressjs + mongoose app中了解它的集成:

https://medium.com/@sergiy.stotskiy/authorization-with-casl-in-express-app-d94eb2e2b73b