Spring security 3.2:自定义 UserDetails 和 UserDetailsS​​ervice 是不是需要自定义 AuthenticationManager?

Posted

技术标签:

【中文标题】Spring security 3.2:自定义 UserDetails 和 UserDetailsS​​ervice 是不是需要自定义 AuthenticationManager?【英文标题】:Spring security 3.2: Does a custom UserDetails & UserDetailsService need a custom AuthenticationManager?Spring security 3.2:自定义 UserDetails 和 UserDetailsS​​ervice 是否需要自定义 AuthenticationManager? 【发布时间】:2013-10-11 12:48:29 【问题描述】:

我正在使用 spring security 3.2、JSF2、Hibernate4。

我已经完成了 3/4 的工作 :) 但我的身份验证系统还没有工作。

我有一个实现UserDetailsS​​ervice的UserService,一个实现UserDetails的域类User。

登录系统永远不会阻止用户访问安全页面,我尝试了数据库中不存在的用户名和密码...

感谢您的帮助。

我有一个 loginBean,他在通过登录表单连接时尝试对用户进行身份验证:

public String login() 

        try 

            Authentication request = new UsernamePasswordAuthenticationToken(this.getUsername(), this.getPassword());
            Authentication result = authenticationManager.authenticate(request);
            SecurityContextHolder.getContext().setAuthentication(result);

         catch (AuthenticationException e)  e.printStackTrace();

        return "secured";
    

我的春季安全看起来像这样:

`<security:global-method-security jsr250-annotations="enabled" pre-post-annotations="enabled" secured-annotations="enabled" />

<security:http auto-config="true" use-expressions="true">
        <security:intercept-url pattern="/Admin" access="isAuthenticated()" />
        <security:form-login login-page="/login.xhtml" authentication-failure-url="/" >    </security:form-login>
    </security:http>

   <!-- User Data Access Object -->
   <beans:bean id="userDao" class="com.clb.genomic.lyon.dao.UserDaoImpl" >
        <beans:property name="sessionFactory" ref="sessionFactory"></beans:property>
   </beans:bean>

     <!-- User Business Object -->
   <beans:bean id="userBo" class="com.clb.genomic.lyon.bo.UserBoImpl" >
        <beans:property name="userDao" ref="userDao" />
   </beans:bean>


    <beans:bean id="login" class="com.clb.genomic.lyon.beans.LoginBean" scope ="request">
         <beans:property name="authenticationManager" ref="authenticationManager" /> 
     </beans:bean>

    <beans:bean id="standardPasswordEncoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder"/>

   <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider user-service-ref="userBo" >
            <security:password-encoder ref="standardPasswordEncoder"/>   
        </security:authentication-provider>
    </security:authentication-manager>`

这是出现的错误...

org.springframework.security.authentication.AuthenticationServiceException: 1
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:109)
at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:132)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
at com.clb.genomic.lyon.beans.LoginBean.login(LoginBean.java:47).....

Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
    at com.clb.genomic.lyon.dao.UserDaoImpl.loadUserByUsername(UserDaoImpl.java:59)
    at com.clb.genomic.lyon.bo.UserBoImpl.loadUserByUsername(UserBoImpl.java:68)
    at com.clb.genomic.lyon.bo.UserBoImpl$$FastClassByCGLIB$$9ea98abf.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204).....

【问题讨论】:

intercept-url 应包含 pattern=/Admin/** 以匹配子资源。 【参考方案1】:

堆栈跟踪的异常显示您正在获取ArrayIndexOutOfBoundsException,并且您似乎正在从一个空数组中读取。

您还应该检查传递给loadUserByUsername() 方法的值,以及该用户是否存在。

【讨论】:

是的,这就是你所说的...在 loadUserByUsername 中传递的值不好...非常感谢,您帮助解决了我的错误。:)

以上是关于Spring security 3.2:自定义 UserDetails 和 UserDetailsS​​ervice 是不是需要自定义 AuthenticationManager?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security教程:自定义表结构

spring security自定义指南

spring security使用和原理简析

Spring Security入门(3-6)Spring Security 的鉴权 - 自定义权限前缀

Spring Boot + Spring Security自定义用户认证

Spring Security 之自定义UserDetails