Oauth 2.0 从自定义ABAC切换到XACML

Oauth 2.0 从自定义ABAC切换到XACML,oauth-2.0,authorization,xacml,abac,alfa,Oauth 2.0,Authorization,Xacml,Abac,Alfa,我将使用OAuth2和XACML(使用AuthZForce)保护我的Spring云应用程序 我已经实现了一个简单的ABAC解决方案,可以处理以下用例,但我想切换到XACML。可能吗 旧域 我有(在数据库中): 策略(例如subject.id==resource.ownerId),由执行点检查以做出决策 具有某些已定义策略的权限(例如删除用户) 拥有某些权限的角色(如员工) 功能(如PREMIUM),包含一些默认的和公司可用的角色和权限 公司,有一些特点 分配给公司的用户 用例 现在,公司的用

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

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

旧域

我有(在数据库中):

  • 策略(例如subject.id==resource.ownerId),由执行点检查以做出决策
  • 具有某些已定义策略的权限(例如删除用户)
  • 拥有某些权限的角色(如员工)
  • 功能(如PREMIUM),包含一些默认的和公司可用的角色和权限
  • 公司,有一些特点
  • 分配给公司的用户
用例

现在,公司的用户可以创建一个新角色role\u X。他可以为此角色分配一些权限

更新


因为这个问题最初包含两个不同的问题,所以我决定将第二个问题外包()

存储策略的地方基本上是不相关的。这将取决于您使用的引擎,例如AuthZForce(我已经ping了作者以便他可以插手)、SunXACML、WSO2或Axiomatics

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

我对你原来的帖子有一些评论

  • subject.id==resource.ownerId
    是我们在XACML中通常称为的条件。将两个属性比较在一起以实现关系
  • 您提到权限,例如
    DELETE\u USER
    。在XACML中,通常将这些属性拆分为原子属性,例如一方面是动作,另一方面是对象或资源(
    USER
    )。RBAC是基于角色和权限的,而ABAC是基于属性的。理想情况下,这些属性表示单个方面(作为用户,尝试删除…)
  • 角色
    仍存在于ABAC中。这将是你们政策的基础
  • 功能和公司是您将使用的属性
考虑到这一点,您可以编写如下策略(使用ALFA表示法):


谢谢你的详细回答。我发现我自己的解决方案类似于XACML,这很完美,因为迁移不会那么困难。但将策略存储在数据库中(在运行时更改策略)对我来说很重要。您知道哪些免费或开源解决方案支持此功能吗?我假设所有开源引擎都可以从数据库读取XACML策略。试试你提到的AT&T XACML、WSO2或AuthZForce。这是OSS社区中最新、最完整的问题之一。你知道我应该如何开始一个新问题吗。问题是它们都没有文档或文档稀少,所以我不知道哪一个最适合数据库策略。您好,作为AuthzForce开发人员之一,我可以提供帮助,但我需要首先澄清您的需求。据我所知,您需要一个XACML PDP,它可以从数据库加载XACML策略进行评估。是否有特定的策略存储格式?任何数据类型或产品?为了更好地解决您的用例,我邀请您通过我们的邮件列表与我们联系,该邮件列表在的支持部分提到。谢谢。我还建议您看看以获取基于角色的策略的示例,并了解如何使用XACML实现这一点。AuthzForce支持此配置文件。
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
            }
        }
    }
}