14

我目前正在开发一个在 JBoss AS 7 上运行的项目,该项目需要来自各种来源的身份验证。我试图了解结合起来提供身份验证的各种组件。

我对这一切如何组合在一起有一些假设/猜测,但我需要确保我的理解是正确的。所以下面是我理解的 JBoss AS7 的身份验证过程。


您有一个安全领域,它定义了如何对用户进行身份验证。然后将此领域暴露给您的应用程序,以保护其中的部分或全部。在 AS7 中,这是在 <subsystem xmlns="urn:jboss:domain:security:1.0"> 元素中配置的。

可以将领域配置为使用登录模块针对各种来源对用户进行身份验证,例如数据库、LDAP、本地文件或其他东西。可以定义多个登录模块,并且您可以指定登录模块的某些组合必须“成功”才能进行身份验证。

实际的用户名和密码是通过定义在 <login-config> 元素中的 web.xml 文件(对于 servlet)中定义的机制传入的。


假设上述过程是正确的(也可能不是):

  • 整个身份验证过程是否属于 JAAS 之类的规范,或者 JAAS 只是此过程的一小部分或可选部分?
  • 是否所有类型的 <auth-methods>(即 BASIC、DIGEST 和 FORM)都适用于各种登录模块?这个页面似乎不建议,但我还没有看到任何与 <login-module> 选项 <login-config> 选项匹配的明确文档。
  • 从登录配置到登录模块的用户名和密码流程似乎很简单,但是像 OpenID 或 OAuth 这样有中间步骤(如重定向到外部登录页面)的系统会发生什么?
  • Seam 3 SecurityApache ShiroSpring Security等项目如何融入这张图片?
4

1 回答 1

13

JavaEE 安全规范给容器实现者留下了很大的空间,所以我将专注于 JBoss 的实现来回答。

JBoss 安全实现

JBoss 依靠 JAAS 身份验证来实现 JavaEE 安全性。这样它就可以从稳定的 API 中受益,并且可以使用现有的LoginModule实现。登录模块用于对主题进行身份验证,也用于将角色添加到Subject. JAAS 提供了用于授权、权限检查的机制,JBoss 在内部使用它。

JAAS LoginModule不仅支持基于密码的身份验证,还支持基于令牌的身份验证。

基于令牌的身份验证

借助 JAAS 可以在 JBoss 中完成的一个很好的例子是对 Kerberos SPNEGO 的 HTTP 协商支持:由于 Tomcat Authenticator 和令牌验证使用JavaSE 标准 Kerberos LoginModule实现了一个额外的auth-method命名。SPNEGO

顺便说一句,LoginModule API 不是必需的,对于某些协议来说它甚至可能过于复杂。例如,使用 PicketLink 支持 OpenID的实现仅使用 Servlet API。

第三方安全库

这些库通常为运行 JavaEE 或纯 Java 上下文的应用程序提供安全层,即使它没有从 JavaEE 规范中获得身份验证或基于角色的授权的好处。

Spring Security 为应用程序开发人员提供了除 JavaEE 安全之外的其他抽象来实现身份验证和授权,这主要归功于ServletFilterWeb 应用程序。可以使用大量选项来保护他的应用程序:可以混合使用多个选项,例如:JAAS 使用、JavaEE 容器安全使用或 Spring Security 特定实现(OpenID 和 OAuth 的情况)。也没有对 JavaEE 的依赖,因此在 JavaSE 上运行时几乎可以在任何情况下使用它。大多数架构师选择在 Spring Security 上构建应用程序安全性,以便将来可以自由切换特定的实现。

Apache Shiro 与 Spring Security 非常相似,但它更年轻并且可能更容易设置。

Seam 安全性不依赖于 JavaEE 安全性或 JBoss,而仅依赖于 Servlet 和 JSF API。对于基于 JSF/Seam 的 Web 应用程序,这显然是最简单的选择。在幕后,它使用了PicketLink实现。

作为结论,使用第三方库作为 JavaEE 安全性的补充或替代的问题取决于架构选择:应用程序复杂性、供应商独立性和可移植性、对实现错误修复或改进的控制。在您的特定上下文中,拥有多个身份验证源需要一个灵活的解决方案,例如支持身份验证提供程序链接(或 Shiro)的 Spring Security。

于 2012-05-07T07:33:26.353 回答