
214
|
第
18
章
18.3.7
基于角色的授权
目前为止,从技术上来说,我们并没有做任何授权(只是区分了已授权和未授权的用户)。
可是,如果只想让客户看到他们自己账号的视图该怎么办?(雇员可以有一个完全不同的
视图,在其中他们可以看到所有用户的账号信息。)
还记得吗?在单个路由里,可以有多个函数,它们会按顺序得到调用。创建一个名为
customerOnly
的函数,只允许客户通过:
const customerOnly = (req, res, next) => {
if(req.user && req.user.role === 'customer') return next()
// 让只允许客户访问的页面知道自己是需要登录的
res.redirect(303, '/unauthorized')
}
再创建一个名为
employeeOnly
的函数,它跟上面略有不同。比如说,我们希望只有雇员才
可以访问路径
/sales
,
而且甚至不想让非雇员知道这个页面的存在,即便他们是误打误撞
才访问的。如果某个潜在的攻击者进入了
/sales
,看到一个
“未授权”页,这也会作为给
他提供的信息,并可能会使他的攻击更容易一些(知道了这个页面的存在)。因此,为了
增加一点儿安全性,希望非雇员在访问
/sales
页时看到的是一个常规的
404
页
,从而不给
潜在的攻击者提供任何头绪:
const employeeOnly = (req, res, next) => {
if(req.user && req.user.role ...