从自定义 ABAC 切换到 XACML

Switch from custom ABAC to XACML

我将使用 OAuth2 和 XACML(使用 AuthZForce)保护我的 Spring 云应用程序。

我已经实现了一个简单的 ABAC 解决方案,可以处理以下用例,但我想切换到 XACML。可能吗?

旧域名

我有(在数据库中):

用例

现在公司的用户可以创建新角色 ROLE_X。他可以为这个角色分配一些权限。

更新

因为这道题原本包含两个不同的题,所以我决定把第二题外包()

您存储策略的位置在很大程度上是无关紧要的。这将取决于您使用的引擎,例如AuthZForce(我已经联系了作者,所以他可以插话)、SunXACML、WSO2 或 Axiomatics。

免责声明:我在 Axiomatics 工作。我们确实使用数据库来存储 XACML 策略,但这不会更改授权要求或建模。

我对你的原作有几点评论 post。

  • subject.id==resource.ownerId 就是我们在 XACML 中通常所说的条件。您将 2 个属性放在一起来实现关系。
  • 您提到权限,例如DELETE_USER。在 XACML 中,您通常将它们拆分为原子属性,例如一方面是一个动作,另一方面是一个对象或资源 (USER)。 RBAC 是基于角色和权限的,而 ABAC 是基于属性的。理想情况下,这些属性表示单个方面(用户,试图删除...)
  • ROLE 仍然存在于 ABAC 中。它将成为您政策的基础。
  • 特征和公司是您会使用的属性。

考虑到这一点,您可以编写如下策略(使用 ALFA 表示法):

namespace axiomatics{

    namespace user{
        attribute role{
            category = subjectCat
            id = "axiomatics.user.role"
            type = string
        }
        attribute company{
            category = subjectCat
            id = "axiomatics.user.company"
            type = string
        }
        attribute userId{
            category = subjectCat
            id = "axiomatics.user.userId"
            type = string
        }
    }

    namespace action{
        attribute actionId{
            category = actionCat
            id = "axiomatics.action.actionId"
            type = string
        }        
    }

    namespace resource{
        attribute company{
            category = resourceCat
            id = "axiomatics.resource.company"
            type = string
        }
        attribute owner{
            category = resourceCat
            id = "axiomatics.resource.owner"
            type = string
        }
    }

    policyset springapp{
        apply firstApplicable
        policy employees{
            target clause user.role == "employee"
            apply firstApplicable
            /**
             * Employees can create roles in their own company
             */
             rule createRole{
                 target clause action.actionId=="create"
                 condition user.company==resource.company
                 permit
             }
             /**
              * Employees can delete roles they own
              */
            rule allowDelete{
                target clause action.actionId == "delete"
                condition user.userId == resource.owner
                permit
            }
        }
    }
}