我正在开发一个Web应用程序,我需要允许用户浏览各种公共页面,如登录,注册,博客等。但是,要查看他的帐户详细信息,他需要登录。我使用护照js进行身份验证。这是一个快速的js应用程序。
我在express中使用中间件中断来检查用户是否已登录以呈现如下所示的相应页面:
app.use(function(req, res, next) {
if(req.isAuthenticated()) {
next();
} else {
res.render('partials/unauth');
}
})
基本上,我在这里说如果用户登录渲染用户请求的任何页面,则会向他显示一个页面,其中显示:Unauthorized或Page不存在。
但是,我想在规则中添加一些例外,如果req是partials / blog(这是一个不需要登录的公共页面),请显示博客页面。我怎样才能做到这一点?
答案 0 :(得分:0)
现在可能已经很晚了,但我确实设法用几个月的方法解决了这个问题:
var publicPages = ['signup', 'login', 'error', 'forgotpassword', 'unauth', '404'];
var privatePages = ['dashboard', 'account'];
//name is the page requested
if(publicPages.indexOf(name)!=-1 || privatePages.indexOf(name)!=-1 && req.isAuthenticated()) {
res.render('partials/'+name);
} else if(publicPages.indexOf(name)==-1 && privatePages.indexOf(name)==-1) {
res.render('partials/404')
} else {
res.render('partials/unauth');
}
答案 1 :(得分:0)
创建中间件:authenticatedOrGuest.js
const passport = require('passport');
module.exports = function (req, res, next) {
// in this sample used jwt strategy, but you can use any
return passport.authenticate('jwt', { session: false }, function (err, user) {
if (err) return next(err);
if (user) req.user = user;
next();
})(req, res, next);
};
然后在应用程序路由中使用它:app.js
const authenticatedOrGuest = require('./middleware/authenticatedOrGuest.js');
app.get('/my-api-endpoint', authenticatedOrGuest, function(req, res) {
let message;
if(req.user) {
// here logic for authenticated user
message = 'Authenticated!';
} else {
// here logic for guest
message = 'Guest!';
}
res.send(message);
});
答案 2 :(得分:-1)
您应该将此身份验证代码保存在以下函数中:
function isLoggedIn(req, res, next){
if(req.isAuthenticated()) {
return next();
} else {
res.render('partials/unauth');
}
};
并且假设您希望用户在路线被击中时登录,那么您应该将此功能作为参数传递给路线。
app.get('/viewDetails', isLoggedIn, function(req, res){
});
如果您不在乎用户是否登录,则不应将此功能作为参数传递给路线。
app.get('/blog', function(req, res){
});