【问题标题】:How to do rights management in REST based applications?如何在基于 REST 的应用程序中进行权限管理?
【发布时间】:2019-08-18 20:02:24
【问题描述】:

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

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

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

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

谁能告诉我实现此类功能的最佳实践。在没有休息和像 JSF/ASP.NET 这样的网络应用程序的过去,我没有遇到过这样的问题,因为我只有一个位置来维护权利,但基于 REST 的应用程序改变了这些规则。

【问题讨论】:

    标签: jwt authorization rights-management


    【解决方案1】:

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

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

    对于您的权限管理,您仍然可以通过简单的 API 请求来维护这一点,并且当用户下次登录时,他们的权限会被刷新!

    有几个状态管理库可用于 React 和 Angular。我熟悉的是Redux(React)和NGRX(Angular)。还有几十个教程;你不会想要的!

    【讨论】:

    • 好的,如果我理解正确,我将在登录时获取用户权限,而不是在 JWT 中,并将其存储在本地。换句话说,后端只会通知用户可以访问哪些资源以及可以执行哪些操作,然后前端必须维护到前端组件的所有映射。现在我可以看到一个问题,如果在用户已经登录的情况下更改了权限并且他将无法看到他有权访问的新组件,将会发生什么。
    • 完全正确。根据系统,我们有几种更新状态权限的方法:首先,我们有一个中间件,每次调用 API 时都会检查权限更新,可以是任何页面或组件。如果有更新,我们会过期他们的 JWT,这将使用户注销,或者我们允许管理员选择注销他们。接下来,Web Sockets 在提交权限更改时更新前端。最后,优秀的管理员会要求用户退出并登录。
    • 感谢您的澄清。您能否指出一些与权限管理相关的 NGRX 和 Redux 教程?
    【解决方案2】:

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

    1. 用户从 Web 前端登录后,您应该能够识别他的角色。
    2. 您需要创建角色到页面/组件的映射
    3. 使用高阶组件渲染所有其他需要授权的组件。
    4. 在高阶组件中,只有当用户被授权或将他移动到其他自定义错误/登录页面时,才会呈现页面/组件的逻辑。

    您可以在这里找到更多信息:https://www.codementor.io/sahilmittal/using-higher-order-components-for-authenticated-routing-i1hcp6pc6

    希望能回答你的问题!!

    【讨论】:

    • 基本上是前端应用负责将页面/组件映射到 REST 资源,后端应该跟踪它?
    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2013-07-20
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多