[nodjes] express中间件之权限认证

86 篇文章 0 订阅

next()

express的路由控制有个next()功能,在定义了多个路由的时候,对匹配的url会按顺序执行,

例如,有这样两个路由,第一个路由会对满足“/”的地址,在req中添加一个user的属性,然后再交给接下去的路由处理

所以当访问....../user时,可以从req中取出user信息

[javascript] view plain copy
  1. app.get(/^\/*/,function(req, res, next){  
  2.     req.user ="shuilan";  
  3.     next(); // 将控制转向下一个符合URL的路由  
  4. });  
  5.                      
  6. app.get('/user'function(req, res){  
  7.     res.send('viewing ' + req.user);  
  8. });  

用这种方式,可以对满足某一条件的url地址,先做一些处理(比如加载用户信息之类的),然后再转交给更具体的路由处理


路由中间件

与此功能类似的,还有路由中间件的功能,

一个路由中可以添加一个或者多个回调函数,如

[javascript] view plain copy
  1. app.get('/user/:id/edit', loadUser, andRestrictToSelf, function(req, res){  
  2.   res.send('开始编辑用户 ' + req.user.name);  
  3. });  

这个路由添加了3个处理函数,会按顺序执行

loadUser可以是形如这样的处理函数

[javascript] view plain copy
  1. function loadUser(req, res, next) {  
  2.   // 这里提供假数据,你可以从数据库中获取真实用户信息  
  3.   var user = users[req.params.id];  
  4.   if (user) {  
  5.     req.user = user;  
  6.     next();  
  7.   } else {  
  8.     next(new Error('不存在的用户 ' + req.params.id));  
  9.   }  
  10. }  

这样就能将多个路由都需要用到的处理提取出来,写成单独的函数,或者用来提前做一些条件判断


其他:

express的use()功能在api中的定义是app.use([path],function),

不指定path的情况下,对应的是默认的'/',

当指定path时,会对匹配的url进行处理,

但是这里的path貌似不能像get、all那样进行正则匹配


使用Express.js 中间件权限管理

在Web 应用中,“权限管理”指面向不同的用户(也指客户端)开放不同的页面(或接口)权限。

可以使用Express.js 中间件实现复杂的规则设置,比如限制全部URL、限制部分URL、限制单个URL 等:

全部URL:app.get('*', auth)

部分URL:app.get('/api/*', auth)

单个URL:app.get('/admin/users', auth)

例如,如果我们需要限制整个/api/目录的访问,可以使用以下语句:
 

 
 
  1. app.all('/api/*', auth);  
  2. app.get('/api/users', users.list);  
  3. app.post('/api/users', users.create);  
  4. ... 

或者这样:
 

 
 
  1. app.get('/api/users', auth, users.list);  
  2. app.post('/api/users', auth, users.create);  
  3. ... 

在前面的例子中,auth()方法接收三个参数:req、res 和next。类似这样:
 

 
 
  1. var auth = function(req, res, next) {  
  2. //鉴定用户  
  3. //如果鉴定失败,则调用next(new Error('Not authorized'));  
  4. //或者res.send(401);  
  5. return next();  

切记,不要忘记调用next()函数,否则Express.js 将无法进行后续的处理(包括调用其他回调、继续尝试匹配其他路由规则等)。


谢谢关注~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值