我有一个小小的困境来解决这个问题。
我有一个用户和一个管理员角色。
userRoles: ['user', 'admin']
用户应该能够列出除管理员以外的所有用户。管理员可以列出所有用户。
我想到的第一个解决方案是在控制器级别检查角色:
if (req.user.role == 'admin'){list all users}
else{list all except admins}
但我想要做的更多是在路线级别,以保持控制器更清洁,但不知何故,它做得很好。它仅列出用户,即使我以管理员身份登录。
router.get('/', auth.hasRole('user'), controller.index);
router.get('/', auth.hasRole('admin'), controller.getUsers);
function hasRole(roleRequired) {
if (!roleRequired) throw new Error('Required role needs to be set');
return compose()
.use(isAuthenticated())
.use(function meetsRequirements(req, res, next) {
if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) {
next();
}
else {
res.status(403).send('Forbidden');
}
});
}
有什么建议吗? 谢谢!
答案 0 :(得分:0)
所以,我不确定这是你的问题,但要记住的一件事是JS不保证数组的索引(根据ecmascript规范),所以你的>=
测试不可靠。
最好像我在AuthZ中那样使用位掩码,在这里您可以将权限或角色分配为固定的二进制数,然后可以对其进行过滤:
// lib/rights.js
module.exports = {
READ : 1 << 0, // 001
WRITE : 1 << 1, // 010
DELETE : 1 << 2 //100
};
// lib/roles.js
var rights = require('./rights');
module.exports = {
ADMIN : rights.READ ^ rights.WRITE ^ rights.DELETE,
MEMBER : rights.READ ^ rights.WRITE,
GUEST : rights.READ
};
然后你可以很容易地检查:
if (user.role & resource.rightsRequired) { /* you're in! */ }