使用passport.jspipe理express.js中不同types用户的身份validation

我在使用Express.js 4.x中的Passport.jspipe理不同types用户的状态时遇到问题。

我在我的mongodb数据库中有3种用户集合

1. Member (has his own profile page) 2. Operator (has his own dashboard) 3. Admin (handles the backend) 

我已经创build了他们单独的login/注册系统。 但只有成员似乎工作,而其他人不。 我甚至为每个用户编写了不同的login/注册策略集。 喜欢会员passport.use('注册')和passport.use('login')。 对于运营商passport.use('op-signup')和passport.use('op-login')等等。 我认为我没有使用正确的方法来处理用户,这意味着集合不需要在单个集合中分离,而是基于angular色。 对 ?

这是目前我现在使用的mongoose模型;

 // Member Schema var MemberSchema = new Schema({ username: String, password: String, name: { first: String, last: String }, locality: String, // and other attributes }); module.exports = mongoose.model('Member', MemberSchema); // OperatorSchema var OperatorSchema = new Schema({ username: String, password: String, name: { first: String, last: String }, officeAddress: String, privatePhone: Number, // and other attributes related to the operator }); module.exports = mongoose.model('Operator', OperatorSchema); 

上述方法是正确的还是这样的?

 var UserSchema = new Schema({ username: String, password: String, roles: { member: { type: Schema.Types.ObjectId, ref: 'Member' }, operator: { type: Schema.Types.ObjectId, ref: 'Operator' }, admin: { type: Schema.Types.ObjectId, ref: 'Admin' } } }); module.exports = mongoose.model('User', UserSchema); // and then plug the sub models to this parent one // Member Schema var MemberSchema = new Schema({ _user: { type: Schema.Types.ObjectId, ref: 'User' }, name: { first: String, last: String }, locality: String, // and other attributes }); module.exports = mongoose.model('Member', MemberSchema); // OperatorSchema var OperatorSchema = new Schema({ _user: { type: Schema.Types.ObjectId, ref: 'User' }, name: { first: String, last: String }, officeAddress: String, privatePhone: Number, // and other attributes related to the operator }); module.exports = mongoose.model('Operator', OperatorSchema); 

在这里我很困惑,并且处于困境,因为当用户状态在login后在会话中被pipe理时,用户对象被暴露给请求对象,因此它一次只能处理一种types的用户,并且可能是会员,操作员和pipe理员不能同时从同一浏览器login。

那么如何在浏览器中将所有这些用户作为不同的实例进行pipe理呢? 我在Node.js是一个新手,来自PHP的背景下,pipe理用户状态是一件轻而易举的:)

我会做的是添加插件,因为你是重复的用户名和密码字段,这是非常多余的

车型/插件/ member.js

 module.exports = function(schema) { schema.add({ // All the appropriate fields that your member schema need role: String, }); } 

车型/ user.js的

 var member = require(./plugins/member); var UserSchema = mongoose.Schema({ username: String, password: String }); UserSchema.plugins(member); 

稍后,当您想要检查哪个用户可以访问哪条path时,请使用中间件来检查它

在你的护照configuration中创build这个

 exports.requireRole = function(role) { return function(req, res, next) { if (req.user && req.user.role === role) next(); else res.send(404); } } 

稍后在你的路线

 app.get('/profile', requireRole('member'), function(req, res) { // do whatever you want to do }); app.get('/dashbord', requireRole('operator'), function(req, res) { // do whatever you want to do }); 

有很多方法可以为用户实现不同的访问级别。 这个方法是很多的。

最好的解决scheme是使用模式无关性。 这就是为什么我们使用像mongoose这样的ORM。

 var VehicleSchema = mongoose.Schema({ make : String, }, { collection : 'vehicles', discriminatorKey : '_type' }); var CarSchema = VehicleSchema.extend({ year : Number }); var BusSchema = VehicleSchema.extend({ route : Number }) var Vehicle = mongoose.model('vehicle', VehicleSchema), Car = mongoose.model('car', CarSchema), Bus = mongoose.model('bus', BusSchema); var accord = new Car({ make : 'Honda', year : 1999 }); var muni = new Bus({ make : 'Neoplan', route : 33 }); accord.save(function(err) { muni.save(function(err) { // vehicles are saved with the _type key set to 'car' and 'bus' }); }) 

在MongoDB的这一点上,你将会得到类似这样的文档

 { "_type" : "car", "make" : "Honda", "year" : 1999, "_id" : ObjectId("5024460368368a3007000002"), "__v" : 0 } { "_type" : "bus", "make" : "Neoplan", "route" : 33, "_id" : ObjectId("5024460368368a3007000003"), "__v" : 0 } Source 

当查询时

 Vehicle.find({}, function(err, vehicles) { console.log(vehicles[0]); // vehicles[0] instanceof Car === true console.log(vehicles[1]); // vehicles[1] instanceof Bus === true }); 

结帐来源/更多的例子,通过查看briankircho小cheatsheet 在这里input链接描述