授权逻辑应该集中还是分散?

时间:2013-10-24 14:13:56

标签: java authentication architecture authorization single-sign-on

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

我们在这两个选项之间进行了辩论:

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

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

2 个答案:

答案 0 :(得分:4)

您应该努力将业务逻辑与非功能性要求(例如身份验证,日志记录和授权)分离。

您已经实施了SSO,当然您使用用户目录作为SSO的后端来存储用户身份。这表明您已成功从您保护的应用程序外部化身份验证。您是否会考虑为每个应用设置一个用户名/密码数据库?你会考虑编写逻辑来管理密码,哈希等吗?当然不是!这同样适用于授权。

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

实现外部授权有两种主要模式:要么使用基于角色的访问控制模型(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等支持 - 这是我工作的地方。 / p>

XACML为您提供了一种基于策略的外部化细粒度授权方法。您可以编写策略并将其应用于任意数量的应用程序。当然,您可以使用XACML扩展您的SSO层。

使用外部授权 - 特别是在XACML上标准化 - 的好处是:

  • 合并授权逻辑:维护更简单,更便宜
  • 更好的安全性:XACML更具表现力,您现在有一个地方可以检查安全性是否正确实施。
  • 展示新业务的能力:我处理的一些客户希望将应用程序暴露给网络/第三方。使用细粒度授权可以让他们控制谁可以做什么以及在什么情况下做什么。
  • 合规:看看我们今天生活的世界。我们必须遵守许多法规,具体取决于我们的工作领域(银行,保险,医疗......)。这些法规很难在代码中实现,但很容易表达为XACML提供的政策。

如果您想了解更多信息,我在JavaZone 2013上发表了关于Java和XACML的演示文稿。幻灯片是here

您使用什么SSO解决方案? SiteMinder为您提供授权API(ActivePolicy)以实现更细粒度的授权。看看那个。

我希望这有帮助!

答案 1 :(得分:2)

我会区分授权所需的逻辑和数据。

如果您正在查看授权逻辑,则它更具体到应用程序。你为什么要集中逻辑?可能有一种情况是在多个应用程序中使用相同的授权逻辑,这种授权逻辑可能会发生变化。许多应用程序不需要这样,并且由于所需的时间和成本,开发用于外部化所有授权逻辑的应用程序可能并不总是可行的选择。为此需要一些策略规范语言,并且每个客户端应用程序都应使用解释器。

集中授权所需的数据是一项更简单的任务,可能是比上述更常用的功能。但是,当所需的数据取决于域对象而不是主题时,您最终会得到上述情况。我想当你有一套应用程序,其中相同的用户角色或属性被应用时,这样做的价值更高(并且可能也需要)。另一种情况可能是需要由一组人进行集中授权管理 - 这可能适用于您的应用程序,也可能不适用。

将一种解决方案放在另一种解决方案上并非我喜欢做的事情。如果我需要为这种性质的问题提出是/否答案,我也会评估其他方面。例如,

  1. 现有应用程序,其实现语言,平台,修改开销和使用的现有授权机制。
  2. 究竟应该集中管理什么(逻辑,数据)?
  3. 集中授权的复杂性是否合理?
  4. 网络通信开销和增加的延迟
  5. 这对系统和部件的可测试性有何影响?
  6. ......这个清单不会轻易结束......