我们有一个用于验证用户身份的 SSO 系统。
我们在这两个选项之间存在争议:
我们是否应该将每个应用程序的授权集中到一个数据库(或任何其他单一解决方案)并在 SSO 请求中检索信息
每个 Web 应用程序客户端都应该在本地数据库/方案中管理自己的授权逻辑。
最佳答案
您应该努力将您的业务逻辑与非功能性需求(例如身份验证、日志记录,当然还有授权)分离。
您已经实现了 SSO,并且肯定会使用用户目录作为 SSO 的后端来存储用户身份。这表明您已成功从您保护的应用程序中外部化身份验证。您会考虑为每个应用程序设置一个用户名/密码数据库吗?你会考虑编写逻辑来管理密码、散列等吗?当然不是!授权也是如此。
分析公司 Gartner 将您正在考虑的领域定义为外部授权管理。您可以找到更多 here如果您是 Gartner 客户。
有两种主要模型可实现外部化授权:使用基于角色的访问控制模型 (RBAC) 或争取基于属性的访问控制 (ABAC)。 NIST 为两者提供了定义和更多信息:
许多应用程序框架提供某种形式的外部化。以 Java Spring 为例:它带有 Spring Security 和 Access Decision Managers(更多关于 Spring 架构 here )。 PHP、Ruby、Python 和 .NET 等等都有自己的方式。
因此,如果可以的话,不要在应用内实现授权逻辑,而是利用给定的框架。
更进一步,您甚至可以考虑标准化您的外部化授权。就像 SSO 有它的标准 (SAML) 一样,外部化授权有 XACML ( eXtensible Access Control Markup Language ),这是一个由 OASIS 定义的标准,很像 SAML,并得到 IBM、Oracle 和 Axiomatics 等公司的支持——我工作的地方。
XACML 为您提供了一种基于策略的方法来实现外部化的细粒度授权。您可以编写策略并将它们应用于任意数量的应用程序。当然,您可以使用 XACML 扩展 SSO 层。
使用外部化授权(尤其是在 XACML 上标准化)的好处是:
- 整合授权逻辑:维护起来更容易、成本更低
- 更好的安全性:XACML 更具表现力,您现在可以去一个地方检查是否正确实现了安全性。
- 展示新业务的能力:与我打交道的一些客户希望将应用展示给网络/第三方。使用细粒度授权让他们可以控制谁可以在什么情况下做什么。
- 合规性:看看我们今天生活的世界。根据我们的工作领域(银行、保险、医疗......),我们必须遵守许多法规。这些规定很难用代码实现,但很容易表达为政策,这正是 XACML 提供的。
如果您想了解更多信息,我在 JavaZone 2013 上发表了关于 Java 和 XACML 的演示文稿。幻灯片是 here .
您使用什么 SSO 解决方案? SiteMinder 为您提供授权 API (ActivePolicy) 以实现更细粒度的授权。看看那个。
希望对您有所帮助!
关于java - 授权逻辑应该集中还是去中心化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19568435/