首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Ory Keto和对象所有权的RBAC

带有Ory Keto和对象所有权的RBAC
EN

Stack Overflow用户
提问于 2022-07-13 08:55:58
回答 1查看 358关注 0票数 0

我正试图通过Ory Keto实现以下几点:

  1. UserA拥有ProductA的所有权,->的所有权给了一个CRUD的权利。
  2. UserB的作用是Admin -> Admin赋予任何东西一个CRUD权限。
  3. UserA有一个角色KYCVerified,或者是一个名为KYCVerified ->的组的一部分,这给了用户额外的权限。

第1点描述了所有权的概念,在Ory的当前状态下,这被描述为RBAC (来源)的一个缺点:

没有所有权的概念: Dan是"Hello“文章的作者,因此可以对其进行更新。

第2点描述了一个基本上通过所有权检查的角色,因为这个角色可以完成所有事情。在目前的状态下,这是可能的,但不能与第1点相结合。

第3点描述了与第2点基本相同的内容,但这更适合我的用例。

我读过网站上的文章和的文章。然而,我仍然无法理解这个概念。下面是我如何看待Ory的所有权概念的例子:

代码语言:javascript
复制
# Tenant TenantA needs to be a owner of product ProductA in order to view it
products:ProductA#view@(tenants:TenantA#owner)

# Tenant A is a owner of ProductA
tenants:ProductA#owner@TenantA

但这将导致许多规则,我甚至不确定这是否是一条道路。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-14 08:31:05

从现在起你是对的。您必须手动创建一组元组。完整的元组应该如下所示:

代码语言:javascript
复制
products:ProductA#owner@UserA
products:ProductA#crud@(products:ProductA#owner)
roles:admin#member@UserB
products:ProductA#curd@(roles:admin#member)
products:ProductA#additional_permissions@(roles:KYCVerified#member)
roles:KYCVerified#member@UserA

使用https://github.com/ory/keto/pull/877,您将能够定义全局重写。它看起来类似于:

代码语言:javascript
复制
import { Context, Namespace } from @ory/keto-config

/**
 * "User" is a namespace with no additional rewrite rules defined.
 */
class User implements Namespace {}

/**
 * "Role"s only have members.
 */
class Role implements Namespace {
  related: {
    members: User[]
  }
}

/**
 * "Product" is a namespace representing a product. It has some rewrites.
 */
class Product implements Namespace {
  // Relations are defined and type-annotated.
  related: {
    /**
     * "owners" are the users that are the owners of the product.
     */
    owners: User[]
    /**
     * "admins" are the roles that are administrators of this product (potentially only one).
     */
    admins: Role[]
    /**
     * "special_roles" are the roles a user has to be member of to gain "additional_permissions"
     */
    special_roles: Role[]
  }

  permits = {
    // this is probably three/four rewrites (create, read, update, delete) with similar rules
    crud: (ctx: Context): boolean =>
      this.related.owners.includes(ctx.subject) ||
      this.related.admins.some((admin) => admin.related.members.includes(ctx.subject)),

    // for the additional_permissions one has to have curd and be member of a special role
    additional_permissions: (ctx: Context): boolean =>
      this.permits.crud(ctx) &&
      this.related.special_roles.some((role) => role.related.members.includes(ctx.subject))
  }
}

这样,您就必须创建这些元组:

代码语言:javascript
复制
products:ProductA#owners@UserA
roles:admin#members@UserB
roles:KYCVerified#members@UserA

products:ProductA#admins@(roles:admin)
products:ProductA#additional_permissions@(roles:KYCVerified)

请注意,不可能(现在也不计划)定义一个可以访问所有东西的admin组。在查询/重写对象时,必须始终在对象和主题之间建立某种关系。这就是建立adminsspecial_roles关系的原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72963496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档