2

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

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

旧域名

我有(在数据库中):

  • 政策(例如,subject.id==resource.ownerId),由执法点检查以做出决定
  • 具有某些已定义策略的权限(例如 DELETE_USER)
  • 拥有某些权限的角色(例如 EMPLOYEE)
  • 具有某些默认值和公司可用角色和权限的功能(例如 PREMIUM)
  • 具有某些功能的公司
  • 分配给公司的用户

用例

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

更新

因为这个问题原本包含两个不同的问题,所以我决定外包第二个问题(AuthZForce for Spring Cloud

4

1 回答 1

2

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

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

我对您的原始帖子有一些评论。

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

考虑到这一点,您可以编写如下策略(使用 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
            }
        }
    }
}
于 2017-06-15T17:04:51.697 回答