我正在使用Express / Node.js和Passport.js(本地护照)&猫鼬。
有两种用户:
/user-login
页面和护照策略'local-user-login'
登录;常规用户存储在"用户" MongoDB集合中)/admin-login
页面和护照策略'local-admin-login'
登录;管理员存储在"管理员" MongoDB集合中)我还有2个页面:/user_home
(仅限常规用户需要访问)和/admin_home
(仅限已记录的管理员 )
/user_home
的路线:
app.get('/user_home', isLoggedIn, function(req, res) {
// render the page
});
function isLoggedIn(req, res, next) {
if (req.isAuthenticated())
return next();
res.redirect('/login');
}
如果我以管理员身份登录并尝试访问/user_home
,它就不允许我这样做,这很好。我的问题是:如何定义另一个" isLoggedIn
"检查我是否以管理员而非常规用户身份登录的功能?理想情况下,我希望有一个功能" isLoggedInAsUser"另一个" isLoggedInAsAdmin"。
到目前为止,我尝试以相同的方式定义/admin_home
路线:
app.get('/admin_home', isLoggedIn, function(req, res) {
// render the page
});
但很明显,为什么它不起作用。代码不知道我希望它检查它是否是管理员而不是普通用户。
答案 0 :(得分:5)
Passport将经过身份验证的用户存储在req.user
中。所以你可以写这样的中间件函数:
function allowAdmins(req, res, next) {
if (req.user.role === 'Admin') return next();
res.redirect('/user-login');
}
function allowRegular(req, res, next) {
if (req.user.role === 'Regular') return next();
res.redirect('/admin-login');
}
然后在路线中:
var userRouter = express.Router();
userRouter.use(isLoggedIn);
// Only authenticated users are allowed
userRouter.get('/home', isRegular, function (req, res) {});
userRouter.get('/admin', isAdmin, function (req, res) {});
app.use('/user', userRouter);
答案 1 :(得分:1)
在会话对象存储角色信息
中在路由配置级别,编写像
这样的中间件 var adminRoutes = express.routes();
adminRoutes.route('/admin/*', function (req, res,next)
{
if(req.session.role==='Admin')
return next();
else
{
res.send("Authorization Error")
}
}
app.use(adminRoutes);
用户路线相同