使用 express-jwt 进行基于角色的授权?
Posted
技术标签:
【中文标题】使用 express-jwt 进行基于角色的授权?【英文标题】:Role based authorization with express-jwt? 【发布时间】:2016-07-20 07:47:00 【问题描述】:我正在使用 express-jwt 来保护我的 API 端点,以便只有经过身份验证的用户才能访问我的 API。现在我还想根据用户的角色保护我的 API。例如,如果用户是管理员,则只能访问某些 API,如果他们是超级管理员,则只能访问其他一些 API,等等。我该如何实现呢?我在 express-jwt github doc 中找到了这段代码 sn-p:
app.get('/protected',
jwt(secret: 'shhhhhhared-secret'),
function(req, res)
if (!req.user.admin) return res.sendStatus(401);
res.sendStatus(200);
);
看起来这段代码正在 API 控制器功能中进行授权。这是唯一且推荐的方法吗?有没有更好的方法来做到这一点?有关于此的最佳做法的任何建议?
【问题讨论】:
【参考方案1】:这是唯一且推荐的方法吗?
差不多,是的。
不过,这不是“控制器功能”。这是一个中间件的例子,这就是你想在这种情况下使用的。
一个更完整的例子是:
var router = new express.Router();
// process jwt stuff
var processjwt = jwt(secret: 'shhhhhhared-secret');
// authorization check
function authorizationCheck(req, res, next)
if (!req.user.admin)
return res.sendStatus(401);
else
// move to the next middleware, cause it's ok
next();
// the real route handler
function myRouteHandler(req, res)
doSomeWork(function(err, data)
if (err) return next(err);
res.json(data);
);
// put it all together
router.use("/protected", processjwt, authorizationCheck);
router.get("/protected", myRouteHandler);
可以使用此设置的数十种变体,但这可以理解。
【讨论】:
您能否详细介绍一下您通常如何进行授权?特别是,例如,我有 3 个用户角色,超级管理员、管理员和用户以及 10 个 API 端点,为了简单起见,我们将它们称为 API 1、API 2、... API 10。如果我只想让超级管理员怎么办?和管理员可以访问 API 1 -> API 3,只有超级管理员和用户可以访问 API 4 -> API 6,而其他所有经过身份验证的用户都可以使用?我能想到的解决方案是编写 2 个中间件处理程序,一个用于 API 1 -> API 3,另一个用于 API 4 -> API 6。你的是什么? 这是否意味着角色信息存储在令牌中?以上是关于使用 express-jwt 进行基于角色的授权?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 HTTP 请求方法使用 Apache Shiro 进行基于角色的授权