我需要为需要使用MongoDB,Express,AngularJS和NodeJS开发的多用户应用程序制作模式。我在该应用程序中有4种类型的用户,GUEST
,REGISTERED_USER
,SUBSCRIBER
,ADMIN
。一旦用户注册了应用程序,我需要根据特定用户的角色显示表单和信息。
有人可以告诉我如何处理用户不同角色的架构,因为我以后可以将它用于角色和访问级别功能吗?
例如,以下registeredUserSchema
对于REGISTERED_USER
,SUBSCRIBER
,ADMIN
用户来说很常见:
var registeredUserSchema = mongoose.Schema({
userId: String,
fullName: String ,
email: String,
password: String,
created: { type: Date, default: Date.now },
roles: [String]
});
但是我需要从具有SUBSCRIBER
角色的用户那里询问大量信息,所以一旦他注册了该应用程序,我想展示很多额外的信息来证明他已被填满在他的acocunt信息中,而不是只有REGISTERED_USER
的用户。
有人可以帮我吗?
编辑:更多说明
例如,REGISTERED_USER
将userId
,但SUBSCRIBER
角色的用户将拥有subscriberId
。因此,我需要决定如何构建数据,因为所有用户都有共同的数据,然后根据他的角色为每个用户提供不同的数据。我需要帮助选择构建数据的策略。例如,在Java Persistence API中,我们有各种继承策略来构造关系数据库表中的数据。
答案 0 :(得分:6)
我在这部分中使用这个集合:
var permissions_schema = mongoose.Schema({
name : String,
title : String
}); // this are mostly static data
var roles_schema = mongoose.Schema({
name : String,
title : String,
_permissions : Array
});// _permissions is an array that contain permissions _id
var contacts_schema = 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数组,并且联系人可以具有多个角色,并且他/她的权限是所有角色权限的合并。
答案 1 :(得分: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
}
});