Spring Security 2.0.6调用UserDetailSservice的loadUserByuserName方法时

时间:2011-03-17 11:06:33

标签: spring-mvc spring-security dao

我正在构建一个简单的Sring MVC应用程序。现在我正在尝试添加Spring安全性。我添加了一个customUserDetailsService,它使用DAO访问MySql数据库并获取用户。

@Transactional(readOnly = true)
public class CustomUserDetailService implements UserDetailsService {

    @EJB(name = "UserDAOLocal")
    UserDAOLocal dao = null;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
        System.out.println("Checking if this is invoked")
        UserDetails user = null;
        DBUsers dbUser = dao.findUserName(username);

        user = new User(dbUser.getUserName(), dbUser.getPassword(), true, true, true, true, getAuthorities(dbUser.getAccess()));
        return user;
    }

    private GrantedAuthority[] getAuthorities(Integer access) {

        GrantedAuthority[] authList = new GrantedAuthority[2];

        authList[0] = new GrantedAuthorityImpl("ROLE_USER");
        if (access.compareTo(1) == 0) {
            authList[1] = new GrantedAuthorityImpl(("ROLE_ADMIN"));

        }
        return authList;
    }
}

我已将UserDetailsService添加到Spring-security.xml

  <security:authentication-manager alias="authenticationManager">
    <security:authentication-provider user-service-ref="customUserDetailsService"/>
</security:authentication-manager>

<bean id="customUserDetailsService" class="service.CustomUserDetailService"/>

我将j_spring_security_check作为操作添加到login.jsp页面上的登录表单。

当我输入有效的用户名和密码时,应用程序总是说错了。更不用说我找不到任何时候customUserDetailsService正在运行的证据。 (我使用System.out.println("Checking if this is invoked")来检查服务器)。

什么调用loadUserByUsername()的{​​{1}}方法?什么时候被调用?

我如何配置它?

(我提供的所有代码可能都是不必要的:))

编辑: 这是Spring-Security.xml的其余部分

CustomUserDetailsService

我通过编辑这样的身份验证提供程序解决了这个问题。我决定不使用DAO和用户数据库。并在xml文件中使用了硬编码用户

<security:http auto-config="true">


    <security:intercept-url pattern="/AddEmployee.htm" access="ROLE_ADMIN"/>
    <security:intercept-url pattern="/FireEmployee.htm" access="ROLE_ADMIN"/>
    <security:intercept-url pattern="/employees.htm" access="ROLE_USER"/>

    <security:form-login login-page="/login.htm"
authentication-failure-url="/login.htm?error=true"
login-processing-url="/j_spring_security_check.htm"
default-target-url="/common.htm"/>

    <security:logout
invalidate-session="true"
logout-success-url="/login.htm"
logout-url="/logout.htm"/>

</security:http>

这很有效。

但我想知道为什么我的customUserDetailService从未使用过,并学习如何正确使用它。

1 个答案:

答案 0 :(得分:2)

分享更多配置。来自Spring-security.xml会有所帮助(如果可能的话)

设计Spring安全性,以便您的身份验证提供程序调用返回userDetails对象的loadUserByUsername() UserDetailsService方法。 流程如下:

  • Authentication Manager的任务是验证用户身份。因此,它将用户名发送到Authentication provider

  • Authentication Provider调用loadUserByUsername()方法并传递返回userDetails对象的String类型的用户名。

  • 现在,此userDetails对象包含用于身份验证的所有必要信息,例如用户名,密码,isEnabled等。

现在,如果您想自定义userDetailsService以使用Dao,则可以对其进行自定义。

这是您的身份验证过程的工作方式。 您可以参考此link以获得更广泛的理解。