2012-03-29 56 views
13

我目前正在开发一个在JBoss AS 7上运行的项目,该项目需要各种来源的身份验证。我试图理解提供认证的各种组件。了解Java应用服务器中的身份验证

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


你有一个安全域,定义用户如何进行身份验证。这个领域然后暴露给您的应用程序,以确保其中的一部分或全部。在AS7中,在<子系统中配置xmlns =“urn:jboss:domain:security:1.0”>元素。

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

实际的用户名和密码通过在web.xml文件(对于servlet)中定义的机制传递,在<登录配置>元素中定义。


假设上述处理是正确的(并且可能没有):

  • 是否像JAAS的规范下这整个认证过程掉落,或是JAAS的只是一个小的或可选部分这个程序?
  • 所有类型的<认证方法>的(即BASIC,DIGEST和FORM)可以与各种登录模块一起工作吗? This page似乎不建议,但我还没有看到任何明确的文档匹配<登录模块>选项<登录配置>选项。
  • 从登录-config来登录模块的用户名和密码的流动似乎直线前进足够的,但像OpenID的OAuth的或在有中间步骤(如重定向到外部登录页)系统会发生什么?
  • Seam 3 Security,Apache ShiroSpring Security这样的项目如何适合这张照片?
+0

要跟踪Yves的回答,您可以在这里找到更多关于Apache Shiro的信息:http://shiro.apache.org如果遇到任何问题,请随时发布到列表。 – Chunsaker 2012-05-10 00:45:32

回答

11

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

JBoss的安全实施

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

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

基于令牌的认证

的什么可以在JBoss的感谢JAAS做一个很好的例子是HTTP Negotiation support for Kerberos SPNEGO:额外auth-method名为SPNEGO实现得益于Tomcat的身份验证和令牌验证使用JavaSE standard Kerberos LoginModule

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

第三方安全库

这些库通常提供的安全层来运行的JavaEE或纯Java方面的应用,即使不采取从的JavaEE规范认证或基于角色的授权收益。

Spring Security为应用程序开发人员提供了除JavaEE安全性之外的其他抽象,以实现身份验证和授权,主要归功于涉及Web应用程序时的ServletFilter。有大量的选择可用于保护他的应用程序:可以混合多个选项,如: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安全性的问题取决于架构选择:应用程序复杂性,供应商独立性和可移植性,对错误修复或改进实现的控制。在您的具体情况下,拥有多个验证来源需要灵活的解决方案,如支持authentication provider chaining(或Shiro)的Spring Security。