请问有什么更好地方式实现页面访问控制?
发布于 9 年前 作者 jsanswer1 3863 次浏览 最后一次编辑是 8 年前 来自 问答

网上大多都是添加一个check函数,比如在未登录之前想访问 /posts/new页面,当然这样是不被允许的,因此需要检查是否登录,所以添加一个函数用于验证:

function checkLogin(req, res, next) {
  if (!req.session.user) {                                                               
      req.flash('error', null); 
     req.flash('error', '请先登录');                                                      
     res.redirect('/login');                                                                   
  }
  next();                                                                                
}       

于是这样使用:

app.get('/posts/new' , checkLogin);    # -> 1
app.get('/posts/new' , function(req, res){            #-> 2
	var user = req.session.user;
	res.render('posts/new', {user: user);               #-> 3
});

上面那样使用的话能实现想要的效果,但是因为异步执行 ,1 处执行时,2 处同样要执行,又因为没有登录 req.session.user 是没有值的,所以 3 处传值时后端会出现这个错误: Cannot read property 'user of undefined

请问有没有好的解决方式阿?

10 回复

app.get(’/posts/new’ , checkLogin, function(req, res){
var user = req.session.user; res.render(‘posts/new’, {user: user); });

登录比较好控制,在控制后台各种操作权限的时候就悲剧了,兄弟们 ,给点思路哈。

@i5ting 额 ,rbac 貌似php 实现很容易

@jerrywu55 哈哈,设计思想,和语言无甚关系,不过是java和php里现成的东西多而已

试试 return res.redirect(’/login’);

function checkLogin(req, res, next) {
  if (!req.session.user) {                                                               
      req.flash('error', null); 
     req.flash('error', '请先登录');                                                      
     res.redirect('/login');                                                                   
  }
  next();                                                                                
}    

没登录的情况下,就不要call next() 了

我移植过php的一个验证类

最近在用sails,感觉它的权限控制非常好,它提供了一个policy 通过中间件的方式来添加各种权限,可以api一对一权限,一对多,多对一,多对多,棒棒哒,题主可以去试试~

回到顶部