gpt4 book ai didi

javascript - 使用 passport.js 在 express.js 中管理不同类型用户的身份验证

转载 作者:可可西里 更新时间:2023-11-01 10:26:33 25 4
gpt4 key购买 nike

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

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

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

我已经创建了他们单独的登录/注册系统。但似乎只有成员在工作,而其他人则没有。我什至为每个用户编写了不同的登录/注册策略集。比如成员 passport.use('signup') 和 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);

我在这里很困惑,处于卡住状态,因为当登录后在 session 中管理用户状态时,用户对象暴露给请求对象,因此它一次只能处理一种类型的用户,并且可能是成员(member)、运算符(operator)和管理员不能从同一浏览器同时登录。

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

最佳答案

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

模型/插件/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);

稍后当你想检查哪个用户可以访问哪个路由时,使用中间件来检查它

在你的 Passport 配置中创建它

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
});

有很多方法可以为用户实现不同的访问级别。此方法是众多方法中的一种。

关于javascript - 使用 passport.js 在 express.js 中管理不同类型用户的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com