CNode

express 权限控制问题,求优雅解决方案,谢谢

问答
JJChehe发布于10 年前最后回复8 年前8 回复10142 浏览0 收藏

我是下面这样实现权限控制的,但我觉得有点问题,如: ①每个路由都要写 前缀 /system_admin/ 以适配控制权限的中间件,非常冗余; ②系统有多种角色,如果一些路由只有部分角色才有权限访问的话,该又如何写呢?

router.all("/system_admin/*", function(req, res, next) {
	if (req.session.user.role == 0) {
		return next();
	} else {
		return next(new Error("权限不足"))
	}
})

router.get("/system_admin/system_user_list", system_admin.system_user_list)
router.get("/system_admin/doctor_list", system_admin.doctor_list)
router.get("/system_admin/patient_list", system_admin.patient_list)
router.post("/system_admin/add_system_user", system_admin.add_system_user)
router.post("/system_admin/edit_system_user", system_admin.edit_system_user)
查看回复

回复 (8)

M
magicdawn#1·10 年前
const adminRouter = require('express').Router();
router.use('/system_admin', adminRouter);

adminRouter.get("/system_user_list", system_admin.system_user_list);
...
J
jackhutu#2·10 年前

把你的中间件改一改, 放到具体路由上, 像这样.

router.get('/add_system_user', middleware(), system_admin.add_system_user)
J
JChehe#3·10 年前
引用 jackhutu把你的中间件改一改, 放到具体路由上, 像这样.

@winky 这种方式比较巧妙,有点绕

J
JChehe#4·10 年前
引用 magicdawn

@magicdawn 嗯,这样路由就像继承。

I
im-here#5·10 年前
引用 jackhutu把你的中间件改一改, 放到具体路由上, 像这样.

@winky middleware()里面怎么实现分到具体路由的?

J
jackhutu#6·10 年前
引用 im-here@winky middleware()里面怎么实现分到具体路由的?

@imhered 我上面那样的写法就是只对该条路由起作用, 具体中间件怎么写,你可以参考 https://github.com/jackhutu/jackblog-api-express/blob/master/server/api/user/index.js 里面的写法.

H
hsluoyz#8·8 年前

可以用这个Express-authz插件,Express专门的权限管理插件,支持RESTful:https://github.com/node-casbin/express-authz

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