edward_eric_zheng
edward_eric_zheng
采纳率100%
2015-03-10 08:24

Spring security 注册的 authentication provider 不起作用?

已采纳

在spring mvc web module中添加使用spring security 模块,需要注入用户验证模块,可是加入配置的验证模块后,其中获取用户验证的部分没有被执行,反而老是执行匿名过滤,想问一下这个到底是什么问题?

配置代码:

<security:http auto-config="true" use-expressions="true" access-denied-page="/auth/denied" >  

<security:intercept-url pattern="/services/auth/admin" access="hasRole('ROLE_ADMIN')"/>  
<security:intercept-url pattern="/services/auth/userauth" access="hasRole('ROLE_USER')"/>   
<security:form-login 
                login-page="/services/auth/login"   
                authentication-failure-url="/services/auth/login_error?error=true"   
                default-target-url="/services/auth/admin"/>  
<security:logout   
                invalidate-session="true"   
                logout-success-url="/auth/login"   
                logout-url="/auth/logout"/>  
</security:http>

<security:authentication-manager>
<security:authentication-provider user-service-ref="userService">
</security:authentication-provider>
</security:authentication-manager>

<bean id="userService" 
    class="org.test.spring.mvc.web.impl.UserServiceImpl"/>  

其中的userservice类是implement UserDetailsService 接口的

public class UserServiceImpl implements UserDetailsService{
} 

按照步骤来说在登录页面,输入username 和password以后,应该会进入此类进行用户判断,但是不知为何,没有进入此类。login 页面的提交是post请求到../services/auth/userauth.

请大家帮忙看一下原因,谢谢。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • edward_eric_zheng edward_eric_zheng 6年前

    没人回答,只能自己debug,最终发现负责用户验证的那个过滤器:org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter,在实现接口方法authenticate的时候,url模式必须严格符合/contextPath/j_spring_security_check.

    这样的话我在web.xml中声明的filter 也会因为这个url格式不起作用,最初的设置是

        <filter>  
            <filter-name>springSecurityFilterChain</filter-name>  
            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
        </filter>  
    
        <filter-mapping>  
            <filter-name>springSecurityFilterChain</filter-name>  
            <url-pattern>/services/*</url-pattern>  
        </filter-mapping>
    

    要修改pattern为

        <filter>  
            <filter-name>springSecurityFilterChain</filter-name>  
            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
        </filter>  
    
        <filter-mapping>  
            <filter-name>springSecurityFilterChain</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>
    

    当然可以自定制自己的providerManager 来实现url重新判定,但是我只想用一下其中的用户验证功能,太麻烦,下次再看。

    点赞 3 评论 复制链接分享

为你推荐