java - 授权逻辑应该集中还是去中心化?

标签 java authentication architecture authorization single-sign-on

我们有一个用于验证用户身份的 SSO 系统。

我们在这两个选项之间存在争议:

  1. 我们是否应该将每个应用程序的授权集中到一个数据库(或任何其他单一解决方案)并在 SSO 请求中检索信息

  2. 每个 Web 应用程序客户端都应该在本地数据库/方案中管理自己的授权逻辑。

最佳答案

您应该努力将您的业务逻辑与非功能性需求(例如身份验证、日志记录,当然还有授权)分离。

您已经实现了 SSO,并且肯定会使用用户目录作为 SSO 的后端来存储用户身份。这表明您已成功从您保护的应用程序中外部化身份验证。您会考虑为每个应用程序设置一个用户名/密码数据库吗?你会考虑编写逻辑来管理密码、散列等吗?当然不是!授权也是如此。

分析公司 Gartner 将您正在考虑的领域定义为外部授权管理。您可以找到更多 here如果您是 Gartner 客户。

有两种主要模型可实现外部化授权:使用基于角色的访问控制模型 (RBAC) 或争取基于属性的访问控制 (ABAC)。 NIST 为两者提供了定义和更多信息:

  • 美国国家标准与技术研究院 RBAC
  • 美国国家标准与技术研究院 ABAC

许多应用程序框架提供某种形式的外部化。以 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/

相关文章:

java - 使用zxing库生成QR时如何在QR码中编码多条记录?

java - "Internal error: couldn' t 创建组件对等”

java - 如何从 swing 中的 JTextField 获取整数值?

javascript - 如何使用 Cognito 身份池和 Amplify 连接到 AWS AppSync

python - python如何表示这么大的整数?

java - JOGL - 打开 GL - 保持世界的一部分静止,同时移动其余部分

.net - .NET 的智能卡身份验证

azure - Auth0 的合适 Azure 替代品

architecture - 一个页面如何发出消息以导航到 Elm 中的另一个页面?

architecture - 应用架构 : Problem with Mutable/Immutable reference