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

问题描述 投票:0回答:1

项目构成

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

前端

  • 网络应用程序(React)
  • 移动应用程序(React Native)

后端

  • API REST(在 Ruby RoR 中)。

访问策略问题

背景:

  • 前端应用程序需要了解给定用户应根据访问策略显示 UI 的哪些部分。
  • 看来我们有一个 RBAC + ABAC 之间的混合模型

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

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

解决方案/想法

我最初的想法是将访问策略逻辑集中在 API 上。通过这种方式,我们可以防止重复,所有规则都在代码库的一部分中,如果我们稍后决定添加前端应用程序甚至 API 微服务,它也会更好地扩展。

缺少的一点是:如何跨后端和前端共享访问策略?

  • 从 API 端点公开此类配置是一个很好的约定吗?

示例:

route: GET /user/access_policies
response :

{
  author: {
    read: true,
    create: true,
    update: false,
    delete: false
  },
  books: {
    read: true,
    create: true,
    update: true,
    delete: false,
  }
}

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

{
  books: {
    read: true,
    create: false,
    update: false,
    delete: false,
    deleteOwnBooks: true, // custom business policy (only delete the books owned by the current user)
    deletePublishedBook: true, // same

  }
}

您对于共享此类访问策略还有其他建议或最佳实践吗?

编辑(2023 年 12 月 5 日)

我们最终采用了以下解决方案: 公开对

User
资源的全局权限。

type User = {
  id: string
  permissions: {
    author: {
      read: boolean,
      create: boolean,
      update: boolean,
      delete: boolean
    },
    books: {
      read: boolean,
      create: boolean,
      update: boolean,
      delete: boolean // Your user role allow you to delete books
    }
  }
}

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

type Book = {
  id: string
  name: string
  permissions: {
    delete: boolean // Check if the book is yours and if its published
  }
}

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

javascript ruby-on-rails architecture acl abac
1个回答
1
投票

如果一般授权(特别是 ABAC)在您的架构中发挥着如此重要的作用,那么我建议您研究类似 OPA 的内容。 如果您可以切换到 RBAC,最简单的方法是在身份提供者中配置角色,并将它们作为您传递的 JWT 中的声明获取。

© www.soinside.com 2019 - 2024. All rights reserved.