ruby-on-rails 跨后端和前端共享访问控制的最佳实践?

fivyi3re  于 2024-01-09  发布在  Ruby
关注(0)|答案(1)|浏览(184)

项目组成

我正在做一个由两个前端应用程序组成的项目,这些应用程序请求一个后端REST-API。
我们的应用程序的组织目前非常简单,但它很快就会发展。

前端

  • Web应用程序(React)
  • 移动的应用(React Native)
    后台
  • API REST(Ruby RoR中)。

访问策略问题

  • 背景:*
    • 前端应用需要知道给定用户的UI的哪些部分应该根据访问策略显示。*
    • 我们似乎有一个RBAC + ABAC的混合模型 *

目前,我们没有一个清晰的架构来管理访问策略,业务逻辑分布在两个应用程序中,这导致了几个问题:

*后端+前端的访问策略代码重复(因此,我们可能最终会在同一策略的代码库的3个不同部分中重复相同的代码)。
***前端复杂条件:**在某些情况下,我们需要获取多个实体来决定用户是否可以访问某个功能。

解决方案

我最初的想法是将访问策略逻辑集中在API上。这样我们就可以防止重复,所有规则都在代码库的一部分中,如果我们以后决定添加前端应用程序甚至API微服务,它也会更好地扩展。
缺少的一点是:如何在后端和前端之间共享访问策略?

  • 从一个API端点公开这样的配置是一个好的约定吗?

示例如下:

  1. route: GET /user/access_policies
  2. response :
  3. {
  4. author: {
  5. read: true,
  6. create: true,
  7. update: false,
  8. delete: false
  9. },
  10. books: {
  11. read: true,
  12. create: true,
  13. update: true,
  14. delete: false,
  15. }
  16. }

字符串
我还可以在简单的CRUD动词之外公开特定的业务策略:

  1. {
  2. books: {
  3. read: true,
  4. create: false,
  5. update: false,
  6. delete: false,
  7. deleteOwnBooks: true, // custom business policy (only delete the books owned by the current user)
  8. deletePublishedBook: true, // same
  9. }
  10. }


关于共享此类访问策略,您是否有其他建议或最佳做法?

编辑(2023年12月5日)

我们最终采用了以下解决方案:在User资源上公开全局权限。

  1. type User = {
  2. id: string
  3. permissions: {
  4. author: {
  5. read: boolean,
  6. create: boolean,
  7. update: boolean,
  8. delete: boolean
  9. },
  10. books: {
  11. read: boolean,
  12. create: boolean,
  13. update: boolean,
  14. delete: boolean // Your user role allow you to delete books
  15. }
  16. }
  17. }


为了启用细粒度的资源权限,我们直接从指定的资源公开它们。

  1. type Book = {
  2. id: string
  3. name: string
  4. permissions: {
  5. // Can only delete own books
  6. // Can only delete published books
  7. delete: boolean
  8. }
  9. }


目前,这种模式很适合我们的需求。但是,需要注意的一个方面是性能,因为它引入了额外的计算。通常,我们通过使用Rest API中的专用查询参数按需查询权限来解决这个问题。

xwbd5t1u

xwbd5t1u1#

如果一般的授权和ABAC在你的架构中扮演着如此重要的角色,那么我建议你看看像OPA这样的东西。如果你可以切换到RBAC,最简单的方法是在身份提供者中配置角色,并在你传递的JWT中获得它们。

相关问题