我们有一个用于验证用户身份的SSO系统。
我们在这两个选项之间进行了辩论:
我们是否应将每个应用程序的授权集中到一个数据库(或任何其他单一解决方案)并检索SSO请求中的信息
每个Web应用程序客户端都应该在其本地数据库/方案中管理自己的授权逻辑。
答案 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上标准化 - 的好处是:
如果您想了解更多信息,我在JavaZone 2013上发表了关于Java和XACML的演示文稿。幻灯片是here。
您使用什么SSO解决方案? SiteMinder为您提供授权API(ActivePolicy)以实现更细粒度的授权。看看那个。
我希望这有帮助!
答案 1 :(得分:2)
我会区分授权所需的逻辑和数据。
如果您正在查看授权逻辑,则它更具体到应用程序。你为什么要集中逻辑?可能有一种情况是在多个应用程序中使用相同的授权逻辑,这种授权逻辑可能会发生变化。许多应用程序不需要这样,并且由于所需的时间和成本,开发用于外部化所有授权逻辑的应用程序可能并不总是可行的选择。为此需要一些策略规范语言,并且每个客户端应用程序都应使用解释器。
集中授权所需的数据是一项更简单的任务,可能是比上述更常用的功能。但是,当所需的数据取决于域对象而不是主题时,您最终会得到上述情况。我想当你有一套应用程序,其中相同的用户角色或属性被应用时,这样做的价值更高(并且可能也需要)。另一种情况可能是需要由一组人进行集中授权管理 - 这可能适用于您的应用程序,也可能不适用。
将一种解决方案放在另一种解决方案上并非我喜欢做的事情。如果我需要为这种性质的问题提出是/否答案,我也会评估其他方面。例如,