1

如何使用 XACML(使用 WSO2 PDP)和 PIP(如果需要)覆盖以下场景。

在二手车应用程序中,在特定位置,销售人员可以查看更新汽车价格。他们只能查看分配给他们的汽车。

现在从角度来看,我们可以为销售人员角色创建策略并根据位置隐藏特定菜单。

但是如何处理该方法getCarDetails(Object User){...}

这里基于UserID(销售人员)我们将显示列表。

如何使用规范设计这个?

我对此的理解是:我们可以使用并在此方法之上添加“销售人员”角色。但它只会限制来自不同角色的其他用户。从那里我很困惑,我们应该根据我们的传统应用程序使用用户 ID 使用数据库调用并获取汽车列表,还是有办法通过 xacml 获得细粒度访问?

4

1 回答 1

2

您的问题包含 2 个问题:

  1. 我如何为我的政策建模?
  2. 如何保护我的应用程序?(执行决定)

首先,让我们在 ALFA 中为您的策略建模:

规则:当且仅当分配给汽车的销售人员标识符等于请求用户的身份时,销售人员才能查看汽车。

在 ALFA 中,这变为:

namespace com.axiomatics{
    /**
     * A sales person can view a car if and only if the car's assigned salesperson 
     * identifier is equal to the requesting user's identity.
     */
    policy viewCars{
        target clause user.role=="sales person" and actionId == "view" and objectType=="car"
        apply firstApplicable
        /**
         * 
         */
        rule allowAssignedUser{
            permit
            condition car.assignedSalesPerson==user.identifier
        }
    }
}

这就是你的模型排序。

现在,关于第二个问题:我如何执行授权?我反对混合由 Spring Security 和 XACML 策略管理的角色,除非你正确记录它们。

您可以采取两种方法。

  1. 使用多决策配置文件 - 这是 XACML 3.0 可选配置文件集的一部分,或者
  2. 使用反向查询方法 - 这仅适用于 Axiomatics。我不确定 WSO2 是否支持它。

多决策配置文件 (MDP) 定义了如何使用单个请求将多个以这为您节省了几次往返行程。您将收到的响应将包含与发送的原始请求中的授权请求一样多的决定。您还可以节省运输时间和评估时间。当您知道要保护的项目数量以及该数字在 1 到 1,000 之间但不大于时,请使用 MDP(当然,它总是值得一试)。您可以在Axiomatics 博客上阅读有关 MDP 的更多信息。在您的情况下,流程如下:

  1. 打电话getCarDetails(Object user)
  2. 调用底层数据库检索所有汽车
  3. 以 MDP 方式调用 PDP 以获取找到的所有记录以做出决定
  4. 只返回那些你有许可证的记录

主要缺点是您最终可能会从数据库中收到数千条甚至数百万条记录。那么使用 MDP 是不切实际的。

反向查询方法很有趣,尽管它特定于 Axiomatics。它在 XACML PDP 之上定义了一个新接口,允许您以相反的方式查询授权引擎。而不是问:

  • 爱丽丝可以看到 123 号车吗?

反向查询让你问

  • 爱丽丝可以看到哪些汽车?

响应不是 Permit 或 Deny,而是过滤器表达式,例如 SQL 语句,例如

  • SELECT id FROM cars WHERE assignmentSP='Alice';

然后,您所要做的就是对您的数据库使用 SQL 语句来查询它并只返回授权的数据。无论您的数据库中有多少数据,这都有效。您可以通过此网络研讨会找到有关 ARQ SQL 的更多信息。

于 2014-12-22T17:10:39.497 回答