如何在 Passport.js 中定义多个 isAuthenticated 函数?
How can you define multiple isAuthenticated functions in Passport.js?
我正在使用 Express/Node.js 和 Passport.js(passport-local) & Mongoose 构建一个应用程序。
有两种用户:
- 普通用户(他们使用
/user-login
页面和通行证策略 'local-user-login'
登录;普通用户存储在 "Users" MongoDB 集合中)
- 管理员(他们使用
/admin-login
页面和通行证策略 'local-admin-login'
登录;管理员存储在 "Admins" 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
});
但很明显为什么它不起作用。代码不知道我想让它检查它是否是管理员而不是普通用户。
在会话对象中存储角色信息
在路由配置层,像
这样写中间件
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);
用户路由相同
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);
我正在使用 Express/Node.js 和 Passport.js(passport-local) & Mongoose 构建一个应用程序。
有两种用户:
- 普通用户(他们使用
/user-login
页面和通行证策略'local-user-login'
登录;普通用户存储在 "Users" MongoDB 集合中) - 管理员(他们使用
/admin-login
页面和通行证策略'local-admin-login'
登录;管理员存储在 "Admins" 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
});
但很明显为什么它不起作用。代码不知道我想让它检查它是否是管理员而不是普通用户。
在会话对象中存储角色信息
在路由配置层,像
这样写中间件 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);
用户路由相同
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);