您的问题包含 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 策略管理的角色,除非你正确记录它们。
您可以采取两种方法。
- 使用多决策配置文件 - 这是 XACML 3.0 可选配置文件集的一部分,或者
- 使用反向查询方法 - 这仅适用于 Axiomatics。我不确定 WSO2 是否支持它。
多决策配置文件 (MDP) 定义了如何使用单个请求将多个以xacml编写的授权请求发送到策略决策点 (PDP)。这为您节省了几次往返行程。您将收到的响应将包含与发送的原始请求中的授权请求一样多的决定。您还可以节省运输时间和评估时间。当您知道要保护的项目数量以及该数字在 1 到 1,000 之间但不大于时,请使用 MDP(当然,它总是值得一试)。您可以在Axiomatics 博客上阅读有关 MDP 的更多信息。在您的情况下,流程如下:
- 打电话
getCarDetails(Object user)
。
- 调用底层数据库检索所有汽车
- 以 MDP 方式调用 PDP 以获取找到的所有记录以做出决定
- 只返回那些你有许可证的记录
主要缺点是您最终可能会从数据库中收到数千条甚至数百万条记录。那么使用 MDP 是不切实际的。
反向查询方法很有趣,尽管它特定于 Axiomatics。它在 XACML PDP 之上定义了一个新接口,允许您以相反的方式查询授权引擎。而不是问:
反向查询让你问
响应不是 Permit 或 Deny,而是过滤器表达式,例如 SQL 语句,例如
- SELECT id FROM cars WHERE assignmentSP='Alice';
然后,您所要做的就是对您的数据库使用 SQL 语句来查询它并只返回授权的数据。无论您的数据库中有多少数据,这都有效。您可以通过此网络研讨会找到有关 ARQ SQL 的更多信息。