CNode

请问有什么更好地方式实现页面访问控制?

问答
Jjsanswer1发布于11 年前最后回复11 年前10 回复4711 浏览0 收藏

网上大多都是添加一个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)

W
wangyangkobe#1·11 年前

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

J
jerrywu55#2·11 年前

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

J
jerrywu55#4·11 年前
引用 i5ting@jerrywu55 rbac or acl

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

I
i5ting#5·11 年前
引用 jerrywu55@i5ting 额 ,rbac 貌似php 实现很容易

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

G
gynmi#6·11 年前

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

L
leapon#7·11 年前
function checkLogin(req, res, next) {
  if (!req.session.user) {                                                               
      req.flash('error', null); 
     req.flash('error', '请先登录');                                                      
     res.redirect('/login');                                                                   
  }
  next();                                                                                
}    

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

C
coolicer#8·11 年前

我移植过php的一个验证类

Q
qianjiahao#10·11 年前

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

参与回复
登录后即可参与回复。登录