【发布时间】:2019-07-31 08:38:20
【问题描述】:
我已经解决了这个问题。我找到Express.js role-based permissions middleware 并使用它。太好了,我会重写我的代码!
我想检查多重权限,但它不适合我。
我创建了 3 个中间件来检查权限:requiredAuth、checkAdmin 和 checkCompanyManager。
型号:User:{name,permistion,isBlocked,公司:{id,userPermistion}}
requiredAuth函数会检查并找到signedUser,并将其设置为res.locals.user
const checkAdmin = (req, res, next) => {
let user = res.locals.user
if (user.permission === 2) next()
else res.json({errors: "Only admin can do this action"})
}
const checkCompanyManager = (req, res, next) => {
let user = res.locals.user
let companyId = req.body.companyId ? req.body.companyId : req.query.companyId
if (user.company.id && user.company.id.equals(companyId)
&& user.company.userPermistion === 1) next()
else res.json({errors: "Only company member can do this action"})
}
最后,我使用路由器中的 all 来检查操作阻止用户(只有管理员或公司经理可以阻止用户)
router.post('/admin/block-by-ids',
requiredAuth,
checkAdmin || checkCompanyManager,
userController.blockByIds
)
但是不行,因为如果checkAdmin错了,就是break返回json,不运行checkCompanyManager我可以这样解决这个问题:
router.post('/admin/block-by-ids',
requiredAuth,
(req, res, next) => {
let user = res.locals.user
let companyId = req.body.companyId
if ((user.permission === 2) ||
(user.company.id && user.company.id.equals(companyId) &&
user.company.userPermistion === 1)) {
next()
} else next("Only admin or company manager can do this action")
},
userController.blockByIds
)
但这并不好玩!我只想用中间件检查,不想再写代码。我怎样才能做到这一点?我想要你的想法!
【问题讨论】:
-
您意识到
||运算符被定义为返回第一个真值吗?由于checkAdmin和checkCompanyManager都是函数,它们都是真的,因此||运算符返回checkAdmin
标签: javascript node.js express mongoose