Jwt 如何在基于REST的应用程序中进行权限管理?

Jwt 如何在基于REST的应用程序中进行权限管理?,jwt,authorization,rights-management,Jwt,Authorization,Rights Management,所以,我知道REST后端的资源有多安全,这不是问题所在。我的问题是如何在RESTAPI和客户端应用程序/前端上管理用户/权限管理 考虑下面的示例,我的API中有资源订单和发票,我的前端应用程序中也有路由订单、发票和仪表板,它们是用angular/react编写的,为了简单起见,我们应该调用这些页面。我可以根据端点和谓词在数据库中存储每个角色/用户的权限,这很好,但是如何在前端管理相同的内容?在本例中,发票、订单和仪表板可能以某种方式同时使用这两种资源,因此这不是一对一的关系,从用户的角度来看,他

所以,我知道REST后端的资源有多安全,这不是问题所在。我的问题是如何在RESTAPI和客户端应用程序/前端上管理用户/权限管理

考虑下面的示例,我的API中有资源订单和发票,我的前端应用程序中也有路由订单、发票和仪表板,它们是用angular/react编写的,为了简单起见,我们应该调用这些页面。我可以根据端点和谓词在数据库中存储每个角色/用户的权限,这很好,但是如何在前端管理相同的内容?在本例中,发票、订单和仪表板可能以某种方式同时使用这两种资源,因此这不是一对一的关系,从用户的角度来看,他似乎对页面拥有权限。我如何维持这种关系

我是否应该通过将这些前端模块/页面/路由映射到REST端点来将其存储在后端?然而,这种方法是否违反了单一责任原则,并且阻碍了新客户端应用程序的适应和可伸缩性?如果不是,我应该编码端点,用户在JWT中可以访问的动词,并让客户端应用程序使用端点和客户端页面之间的某种映射来决定如何处理它。然而,在这种情况下,我将增加JWT的大小,当我的端点增加时,JWT的大小将呈指数增长

我的情况更为棘手,因为前端应用程序还负责为用户分配权限。可以将其视为工作流引擎或权限管理,其中管理员用户定义角色并授予不同页面的权限(从用户的角度)


有谁能告诉我实现这种功能的最佳实践吗。在没有rest和JSF/ASP.NET等web应用程序的旧时代,我没有这样的问题,因为我只有一个位置来维护权限,但基于rest的应用程序会更改这些规则。

处理这一问题的最佳方法是在react中创建一个高阶组件

  • 用户从web前端登录后,您应该能够识别他的角色
  • 您需要创建角色到页面/组件的映射
  • 使用高阶组件渲染所有其他需要授权的组件
  • 在高阶组件中,只有在用户获得授权或将其移动到其他自定义错误/登录页面时,才具有呈现页面/组件的逻辑
  • 您可以在此处找到更多信息:


    希望这能回答你的问题

    您可能想了解一下状态管理。如果您不确定,状态管理是一系列保存在前端应用程序“存储”中的唯一变量。您可以在整个应用程序中变异、获取和设置这些变量,并且可以从任何地方随时访问这些变量。另外,后端没有保存任何状态或会话信息,因此仍然是RESTful的

    在您的情况下,当用户登录时,他们的权利或权限可能作为JSON响应的一部分或通过编码的JWT(这也将有助于管理JWT的大小,您不必将所有内容都放在那里)。权限将添加到状态中,在生成组件之前,您可以检查用户是否具有正确的权限,并有选择地加载组件。您可以对函数调用和API请求执行相同的操作;没有许可,就没有行动

    对于您的权限管理,您仍然可以通过简单的API请求来维护它,当用户下次登录时,他们的权限将刷新


    有几个状态管理库可用于React和Angular。我熟悉的是(反应)和(角度)。还有几十个教程在那里;你不会想要的

    好的,如果我理解正确,我将在响应中登录时获得用户权限,而不是在JWT中,并将其存储在本地。换句话说,后端将只通知用户可以访问哪些资源以及可以执行哪些操作,然后前端必须维护到前端组件的所有映射。现在有一个问题我可以看到,如果在用户登录时权限被更改,他将无法看到他有权访问的新组件,那么会发生什么情况。这是完全正确的。根据系统的不同,我们有几种更新状态权限的方法:首先,我们有一个中间件,它在每次进行API调用时检查权限更新,该调用可以是任何页面或组件。如果有更新,我们将终止他们的JWT,这将注销用户,或者我们允许管理员选择注销用户。接下来,Web套接字在提交权限更改时更新前端。最后,好的ol'管理员要求用户注销和登录。感谢您的澄清。你能给我指一下NGRX和Redux中与权限管理相关的一些教程吗?基本上,前端应用程序负责将页面/组件映射到REST资源,后端应该跟踪它?