我想让我的Spring应用程序尝试两种预认证方法(Siteminder和Java EE容器认证)。如何使用J2eePreAuthenticatedProcessingFilter和自定义身份验证提供程序?
- 如果这些过滤器的定位一个用户名 - 我要核对我的用户数据库的用户名和分配基于我在数据库中看到角色。 (我有一个AuthenticationUserDetailsService的实现,这对我来说是这样的。)
- 如果没有 - 显示一个登录页面给用户。根据我的用户数据库检查他们在表单中输入的凭据。
Siteminder集成工作正常。登录表单也在工作。 我的问题是Java EE预认证。它从来没有在踢
我的applicationContext-security.xml文件:
<!-- HTTP security configurations -->
<sec:http auto-config="true" use-expressions="true">
<sec:form-login login-processing-url="/resources/j_spring_security_check" always-use-default-target="true" default-target-url="/" login-page="/login"
authentication-failure-url="/login?login_error=t" />
<sec:logout logout-url="/resources/j_spring_security_logout" />
<sec:access-denied-handler error-page="/accessDenied" />
<sec:remember-me user-service-ref="customUserDetailsService" token-validity-seconds="86400" key="OptiVLM-VaultBalance" />
<sec:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter"/>
<sec:custom-filter after="PRE_AUTH_FILTER" ref="jeePreAuthenticatedFilter"/>
<!-- various intercept-url elements here, skipped for brevity -->
</sec:http>
<!-- Authentication Manager -->
<sec:authentication-manager alias="authenticationManager">
<!-- J2EE container pre-authentication or Siteminder -->
<sec:authentication-provider ref="customPreAuthenticatedAuthenticationProvider" />
<!-- Default provider -->
<sec:authentication-provider user-service-ref="customUserDetailsService" />
</sec:authentication-manager>
<!-- Siteminder pre-authentication -->
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="exceptionIfHeaderMissing" value="false" />
</bean>
<!-- J2EE pre-authentication -->
<bean id="jeePreAuthenticatedFilter" class="org.springframework.security.web.authentication.preauth.j2ee.J2eePreAuthenticatedProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<!-- Custom pre-authentication provider -->
<bean id="customPreAuthenticatedAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService" ref="customAuthenticationUserDetailsService" />
</bean>
我在WebSphere支持Java 2的安全性,而我登录的 'ADMIN5'。 (我有一个用户在我的用户数据库中有这个用户名。)但是当我访问应用程序时,从不会调用'customAuthenticationUserDetailsService'bean来验证用户名。我知道这一点,因为'customAuthenticationUserDetailsService'做了大量的日志记录,清楚地显示了它在做什么。当我使用Siteminder预认证时 - 'customAuthenticationUserDetailsService'工作得很好,我在日志中得到一些跟踪输出。但不为J2EE认证...
我的猜测是,这些东西正在发生的事情:
一)Java EE的预认证过滤器没有定位的用户名,所以它永远不会调用认证管理器
b)的Java EE预认证过滤器工作正常,但我的自定义身份验证提供者从未被认证管理器由于某种原因
顺便说一句叫,默认的认证供应商,它采用“customUserDetailsService”不踢任一。再次,我可以告诉,因为日志中没有'customUserDetailsService'的输出。
你可以建议上可能是什么问题就在这里?如果不是解决方案,那么有关如何解决这个问题的建议将不胜感激。
J2eePreAuthenticatedProcessingFilter其实是一个很简单的类。它只是调用'HttpServletRequest.getUserPrincipal()'来获取当前用户。我会检查这是由websphere正确设置,只需在过滤器中自己调用该方法,例如,通过容器登录时。 – 2012-03-22 23:50:56
谢谢你,卢克。我会明天尝试 – anton1980 2012-03-23 04:27:31
是的,HttpServletRequest.getUserPrincipal()返回null ...我想这可能是因为我的web.xml没有安全约束。这是我从阅读关于返回null时的情况中得到的感觉。 – anton1980 2012-03-23 21:28:09