【问题标题】:Mongoose schema for Multi-User application多用户应用程序的猫鼬模式
【发布时间】:2014-12-06 21:53:03
【问题描述】:

我需要为需要使用 MongoDB、Express、AngularJS 和 NodeJS 开发的多用户应用程序创建架构。我在该应用程序中有 4 种类型的用户,GUESTREGISTERED_USERSUBSCRIBERADMIN。用户注册应用程序后,我需要根据特定用户的角色显示表单和信息。

有人能给我一些关于如何处理用户不同角色的架构的想法吗,因为我以后可以将它用于角色和访问级别的功能?

例如,REGISTERED_USERSUBSCRIBERADMIN 用户常见以下registeredUserSchema

var registeredUserSchema = mongoose.Schema({
    userId: String,
    fullName: String ,
    email: String,
    password: String,
    created: { type: Date, default: Date.now },
    roles: [String]
});

但是我需要向具有SUBSCRIBER 角色的用户询问很多信息,所以一旦他注册到应用程序,我想显示很多额外的信息来显示他要填写在他的帐户信息,而不是只有REGISTERED_USER 的用户。

有人可以帮我吗?

编辑:更多解释

例如,REGISTERED_USER 将具有userId,但具有SUBSCRIBER 角色的用户将具有subscriberId。所以我需要决定如何构建这些数据,因为所有用户都有共同的数据,然后根据每个用户的角色,每个用户都有不同的数据。我需要有关选择构建该数据的策略的帮助。例如,在 Java Persistence API 中,我们有各种继承策略来构造关系数据库表中的数据。

【问题讨论】:

    标签: node.js angularjs mongodb express mongoose


    【解决方案1】:

    这是来自 MEAN.JS yeoman 脚手架生成器的用户模式:

        var UserSchema = new Schema({
        firstName: {
            type: String,
            trim: true,
            default: '',
            validate: [validateLocalStrategyProperty, 'Please fill in your first name']
        },
        lastName: {
            type: String,
            trim: true,
            default: '',
            validate: [validateLocalStrategyProperty, 'Please fill in your last name']
        },
        displayName: {
            type: String,
            trim: true
        },
        email: {
            type: String,
            trim: true,
            default: '',
            validate: [validateLocalStrategyProperty, 'Please fill in your email'],
            match: [/.+\@.+\..+/, 'Please fill a valid email address']
        },
        username: {
            type: String,
            unique: 'testing error message',
            required: 'Please fill in a username',
            trim: true
        },
        password: {
            type: String,
            default: '',
            validate: [validateLocalStrategyPassword, 'Password should be longer']
        },
        salt: {
            type: String
        },
        provider: {
            type: String,
            required: 'Provider is required'
        },
        providerData: {},
        additionalProvidersData: {},
        roles: {
            type: [{
                type: String,
                enum: ['user', 'admin']
            }],
            default: ['user']
        },
        updated: {
            type: Date
        },
        created: {
            type: Date,
            default: Date.now
        },
        /* For reset password */
        resetPasswordToken: {
            type: String
        },
        resetPasswordExpires: {
            type: Date
        }
    });
    

    【讨论】:

    • 如果我有 3 个角色,比如 REGISTERED_USERSUBSCRIBERADMIN,并且每个角色中都有一些公共数据,那么我应该如何构建这些数据以将其保存到数据库。例如,如果UserSchema 是需要为 3 个角色中的任何一个的用户保存的公共数据,该怎么办?如何为具有其他角色的用户构建架构?谢谢你的回复。
    • 您可以将附加信息添加到 UserSchema 中,并且仅在角色与应有的匹配时才填充它。
    • 但是我应该如何处理注册时我只想分配REGISTERED_USER角色的用户,以及我想分配SUBSCRIBER角色的用户?跨度>
    【解决方案2】:

    我在这部分使用这个集合:

    var permissions_schema = new mongoose.Schema({
        name : String,
        title : String
    }); // this are mostly static data
    
    var roles_schema = new mongoose.Schema({
        name : String,
        title : String,
        _permissions : Array
    });// _permissions is an array that contain permissions _id
    
    var contacts_schema = new mongoose.Schema({
        mobile : String,
        password : String,
        first_name : String,
        last_name : String,
        _role : Number,
        _enabled : Boolean,
        _deleted : Boolean,
        _verify_code : Number,
        _groups_id : Array,
        _service_id : String
    }); // and at last _role is _id of the role which this user owns.
    

    借助这些集合,您可以轻松管理您的用户。 我希望这些对你有好的想法。

    更新: 更灵活的模式可以在联系人对象中有一个role_id数组,并且联系人可以有多个角色,他/她的权限是所有角色权限的合并。

    【讨论】:

    • 我所拥有的是基于用户的角色,我需要询问并将信息保存到数据库中。例如,注册用户将拥有userId,但具有订阅者角色的用户将拥有subscriberId。所以我需要决定如何构建这些数据,因为所有用户都有共同的数据,然后根据每个用户的角色,每个用户都有不同的数据。我需要有关选择构建该数据的策略的帮助。例如,在 Java Persistence API 中,我们有各种继承策略来构造关系数据库表中的数据。
    猜你喜欢
    • 2019-09-22
    • 2016-12-03
    • 2020-04-22
    • 2016-04-24
    • 2016-08-05
    • 2014-11-29
    • 2023-04-09
    • 2020-08-01
    • 2012-02-02
    相关资源
    最近更新 更多