使用 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 进行基于角色的授权

使用 IdentityServer4 对 Web API 进行基于角色的授权

如何在 express-JWT 中获取授权令牌?

使用 Keycloak 和 .NET 核心的基于角色的授权

基于角色的 jwt 授权

express-jwt 和带有 cookie 的 Angular 9:未在“授权”标头中设置令牌