使用 PassportJS 管理员登录
Admin Login With PassportJS
伙计们,我可以让用户注册和登录。但我想进行管理员登录。该管理员也将是用户。所以我试着做了一个ensureAdmin function
。但它不起作用。 İt 总是重定向到登录页面。
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'
},
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
bcrypt.compare(password, user.password, function(err, isMatch){
if(err) throw err;
if(isMatch){
return done(null, user);
} else {
return done(null, false, {message: 'Wrong password'});
}
});
});
}
));
function ensureAdmin(req, res, next){
User.find({"username":"Alp"}
).exec(function(user){
if(req.user = user){
req.isAuthenticated()
return next();
} else {
req.flash('danger', 'Please Login');
res.redirect('/login');
}
});
}
有人可以帮我解决这个问题吗?
在 ensureAdmin
函数中,我在 if 语句中看到一个错误。
if(req.user = user) ...
除此之外,您正在完善流程。
User.find({"username":"Alp"})
查询总是 return 用户名为 Alp
的用户。因此,您可以像这样重写函数:
function ensureAdmin(req, res, next){
if(req.user.username === 'Alp'){
req.isAuthenticated()
return next();
} else {
req.flash('danger', 'Please Login');
res.redirect('/login');
}
}
据我了解,
- 向用户文档添加新字段
isAdmin
- 然后,创建一个新的中间件作为
ensureAdmin
const ensureAdmin = (req, res, next) => {
if (!req.user){
return next(new Error("User Document not found."));
}
if (!req.user.isAdmin){
return next(new Error("User not authorized to access this route."));
}
return next();
}
你可以像这样在任何需要的地方使用它:
app.post("/signin", passportLogin, ensureAdmin, controller.signin);
这将首先检查来自 passportLogin
的用户身份验证并将用户文档推送到此路径 req.user
。所以现在我们的中间件 ensureAdmin
开始玩游戏了。它将检查管理员状态 isAdmin
。如果 isAdmin
为真,它将推送到我们的控制器函数,否则将其抛给错误处理程序。
伙计们,我可以让用户注册和登录。但我想进行管理员登录。该管理员也将是用户。所以我试着做了一个ensureAdmin function
。但它不起作用。 İt 总是重定向到登录页面。
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'
},
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
bcrypt.compare(password, user.password, function(err, isMatch){
if(err) throw err;
if(isMatch){
return done(null, user);
} else {
return done(null, false, {message: 'Wrong password'});
}
});
});
}
));
function ensureAdmin(req, res, next){
User.find({"username":"Alp"}
).exec(function(user){
if(req.user = user){
req.isAuthenticated()
return next();
} else {
req.flash('danger', 'Please Login');
res.redirect('/login');
}
});
}
有人可以帮我解决这个问题吗?
在 ensureAdmin
函数中,我在 if 语句中看到一个错误。
if(req.user = user) ...
除此之外,您正在完善流程。
User.find({"username":"Alp"})
查询总是 return 用户名为 Alp
的用户。因此,您可以像这样重写函数:
function ensureAdmin(req, res, next){
if(req.user.username === 'Alp'){
req.isAuthenticated()
return next();
} else {
req.flash('danger', 'Please Login');
res.redirect('/login');
}
}
据我了解,
- 向用户文档添加新字段
isAdmin
- 然后,创建一个新的中间件作为
ensureAdmin
const ensureAdmin = (req, res, next) => {
if (!req.user){
return next(new Error("User Document not found."));
}
if (!req.user.isAdmin){
return next(new Error("User not authorized to access this route."));
}
return next();
}
你可以像这样在任何需要的地方使用它:
app.post("/signin", passportLogin, ensureAdmin, controller.signin);
这将首先检查来自 passportLogin
的用户身份验证并将用户文档推送到此路径 req.user
。所以现在我们的中间件 ensureAdmin
开始玩游戏了。它将检查管理员状态 isAdmin
。如果 isAdmin
为真,它将推送到我们的控制器函数,否则将其抛给错误处理程序。