【发布时间】:2013-01-27 14:21:55
【问题描述】:
我需要我的安全有以下逻辑:
- 检查是否存在标头参数
- 根据参数是否存在重定向到登录页面(如果未通过身份验证),或检查基本身份验证令牌
在这两种情况下,我都有相同的身份验证提供程序,但我无法让它工作。 委托入口点工作正常,但我从来没有进入我的自定义身份验证提供程序......
这是我的安全配置:
<security:global-method-security
secured-annotations="enabled" />
<security:http entry-point-ref="delegatingAuthenticationEntryPoint"
use-expressions="true" auto-config="false">
<!-- <security:custom-filter position="FORM_LOGIN_FILTER" -->
<!-- ref="usernamePasswordAuthenticationFilter" /> -->
<!-- <security:custom-filter position="BASIC_AUTH_FILTER" -->
<!-- ref="basicAuthenticationFilter" /> -->
<security:intercept-url pattern="/login*"
filters="none" />
<security:intercept-url pattern="/portimaLogin*"
filters="none" />
<security:intercept-url pattern="/**"
access="isAuthenticated()" />
</security:http>
<bean id="delegatingAuthenticationEntryPoint"
class="org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint">
<constructor-arg>
<map>
<entry key="hasHeader('portima','true')" value-ref="PortimaLoginUrlAuthenticationEntryPoint" />
</map>
</constructor-arg>
<property name="defaultEntryPoint" ref="authenticationEntryPoint" />
</bean>
<bean id="usernamePasswordAuthenticationFilter"
class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="authenticationFailureHandler" ref="authenticationFailureHandler" />
</bean>
<bean id="basicAuthenticationFilter"
class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="authenticationEntryPoint" ref="authenticationEntryPoint" />
</bean>
<bean id="PortimaLoginUrlAuthenticationEntryPoint"
class="be.ap.common.security.spring.PortimaLoginUrlAuthenticationEntryPoint">
<property name="loginFormUrl" value="${portima.login.page}" />
</bean>
<bean id="authenticationEntryPoint"
class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
<property name="realmName" value="AP" />
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider
ref="authenticationProvider" />
</security:authentication-manager>
<bean id="authenticationProvider" class="be.ap.common.security.spring.APAuthenticationProvider" />
<bean id="userDetailsService" class="be.ap.common.security.spring.APUserDetailsService" />
有什么想法吗?
【问题讨论】:
-
您的自定义 AuthenticationProvider 是否正确实现了
supports()方法?如果它为UsernamePasswordAuthenticationToken类返回 false,则永远不会要求它处理过滤器创建的身份验证令牌。 -
它甚至没有进入支持方法...
-
@Override public boolean supports(Class extends Object> authentication) { return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); }
-
看来您声明的过滤器实际上被忽略了。请参阅手册 (static.springsource.org/spring-security/site/docs/3.1.x/…) 了解如何替换命名空间配置创建的过滤器。
标签: spring authentication spring-security