访问控制 - 编码到 activity
Access control - coding to the activity
考虑(来自https://www.owasp.org/index.php/Access_Control_Cheat_Sheet):
if (AC.hasAccess(ARTICLE_EDIT)) {
//execute activity
}
这正确地暗示访问控制
... policy is persisted/centralized in some way
我的问题是关于如何最好地集中它。
我能想到的一种显而易见的方法是将所有需要访问控制的活动包含在 class 中 - 硬编码。我可以简单地在此 class 上调用方法 hasAccess(ARTICLE_EDIT)
。这意味着每当将 activity 添加到应用程序时,我都需要将其添加到 class.
另一种集中访问控制的方法可能是在我的数据库中包含受控活动。每次我需要检查访问权限时,我都会调用 hasAccess(ARTICLE_EDIT)
,这会触发对我的数据库的调用。我会将该方法包含在访问控制模型中。
首先,请问我走的路对吗?还有其他人们喜欢的解决方案吗?请问 benefits/issues 的解决方案可能是什么?
您遇到了 "externalized access control" 问题。很高兴您想到了将业务逻辑与授权逻辑分离。现在您需要一种方式来表达您的授权逻辑。
有一个称为 XACML 的标准,即可扩展访问控制标记语言:
- standard homepage
- definition & architecture
- wikipedia page)。使用 XACML,您可以集中定义访问控制策略。您维护一个外部策略决策点 (PDP),它根据一组已知策略评估传入的 XACML 请求。
使用 XACML ALFA 表示法的示例策略如下所示:
namespace example{
policy article{
target clause itemType=="article"
apply firstApplicable
rule editArticle{
target clause actionId == "edit" and userRole == "editor"
permit
condition userId == owner
}
}
}
考虑(来自https://www.owasp.org/index.php/Access_Control_Cheat_Sheet):
if (AC.hasAccess(ARTICLE_EDIT)) {
//execute activity
}
这正确地暗示访问控制
... policy is persisted/centralized in some way
我的问题是关于如何最好地集中它。
我能想到的一种显而易见的方法是将所有需要访问控制的活动包含在 class 中 - 硬编码。我可以简单地在此 class 上调用方法 hasAccess(ARTICLE_EDIT)
。这意味着每当将 activity 添加到应用程序时,我都需要将其添加到 class.
另一种集中访问控制的方法可能是在我的数据库中包含受控活动。每次我需要检查访问权限时,我都会调用 hasAccess(ARTICLE_EDIT)
,这会触发对我的数据库的调用。我会将该方法包含在访问控制模型中。
首先,请问我走的路对吗?还有其他人们喜欢的解决方案吗?请问 benefits/issues 的解决方案可能是什么?
您遇到了 "externalized access control" 问题。很高兴您想到了将业务逻辑与授权逻辑分离。现在您需要一种方式来表达您的授权逻辑。
有一个称为 XACML 的标准,即可扩展访问控制标记语言:
- standard homepage
- definition & architecture
- wikipedia page)。使用 XACML,您可以集中定义访问控制策略。您维护一个外部策略决策点 (PDP),它根据一组已知策略评估传入的 XACML 请求。
使用 XACML ALFA 表示法的示例策略如下所示:
namespace example{
policy article{
target clause itemType=="article"
apply firstApplicable
rule editArticle{
target clause actionId == "edit" and userRole == "editor"
permit
condition userId == owner
}
}
}