我正在尝试显示不同的登录错误消息,例如“登录失败”或“内部系统错误”。或者甚至可以重定向到不同的页面。我试图按照这里所做的事情http://www.codemarvels.com/2010/12/spring-security-3-how-to-display-login-errors/除了我没有表单登录标签,所以我无法将 authentication-failure-handler-ref 设置为页面上的显示。但是,我确实在 FORM_LOGIN_FILTER 上设置了 authenticationFailureHandler(使用 ExceptionMappingAuthenticationFailureHandler),这是一个仅扩展 UsernamePasswordAuthenticationFilter 的自定义类。
我在这里想念什么?
EDIT-09/19/2013:我做了一些调试,但我问错了问题。看来它工作正常。但是,我有多个身份验证提供程序,第一个的异常被第二个的异常覆盖。基本上,我正在尝试模拟引发的 DB down 异常,但随后尝试对 Active Directory 进行身份验证,并且我只是让用户找不到 exc。因此,我没有得到我的 AuthenticationServiceException。
我想我此时的问题是如何在不改变提供者顺序的情况下从第一个坚持中例外(数据库提供者用于大多数用户)。
<http pattern="/**" authentication-manager-ref='testAuthenticationManager' entry-point-ref="loginUrlAuthenticationEntryPoint" >
<intercept-url pattern="/**" access="ROLE_USER" />
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<custom-filter position="FORM_LOGIN_FILTER" ref="customFormLoginFilter" />
<session-management session-authentication-strategy-ref="sas"/>
</http>
<!-- This just extends UsernamePasswordAuthenticationFilter -->
<beans:bean id="customFormLoginFilter" class="com.acme.security.CustomAuthenticationFilter" >
<beans:property name="sessionAuthenticationStrategy" ref="sas" />
<beans:property name="filterProcessesUrl" value="/j_spring_security_check" />
<beans:property name="authenticationManager" ref="testAuthenticationManager"/>
<beans:property name="authenticationSuccessHandler" ref="successHandler"/>
<beans:property name="authenticationFailureHandler" ref="failureHandler" />
</beans:bean>
<beans:bean id="concurrencyFilter" class="org.springframework.security.web.session.ConcurrentSessionFilter">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="expiredUrl" value="/login.jsp?errorCode=maxSessionsExceeded" />
</beans:bean>
<beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="maximumSessions" value="1" />
</beans:bean>
<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" />
<beans:bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<beans:property name="loginFormUrl" value="/login.jsp"/>
</beans:bean>
<beans:bean id="successHandler"
class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<beans:property name="defaultTargetUrl" value="/login/setup.htm"/>
<beans:property name="alwaysUseDefaultTargetUrl" value="true"/>
</beans:bean>
<beans:bean id="failureHandler"
class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
<beans:property name="defaultFailureUrl" value="/login.jsp" />
<beans:property name="exceptionMappings">
<beans:props>
<beans:prop key="org.springframework.security.authentication.AuthenticationServiceException">/login.jsp?errorCode=666</beans:prop>
</beans:props>
</beans:property>
</beans:bean>