loadUserByUsername 被调用两次(Spring 安全性)

Ami*_*mit 5 spring-mvc spring-security

我正在尝试实现一个功能,用户可以通过用户 ID 或电子邮件地址登录。为了实现这一点,我正在实现我自己的 UserDetailsS​​ervice 并覆盖 loadUserByUsername 方法。

我面临的问题是,每当我尝试进行身份验证时,方法 loadUserByUsername 都会被调用两次。我是 spring 框架的新手,发现很难追踪为什么会发生这种情况。感谢有人能指出我正确的方向来解决这个问题。

spring-security.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-4.0.xsd">

<http auto-config="true" use-expressions="true">
    <csrf disabled="true"/>
    <form-login login-processing-url="/login" login-page='/showlogin' default-target-url='/' authentication-failure-url='/authentication-failure' />
    <intercept-url pattern="/secureview/**" access="hasRole('ROLE_USER')" />
    <remember-me key="patternMinder"/>
    <logout logout-url="/logout" logout-success-url="/?logout" />
</http>

<beans:bean id='userDetailsService' class='com.pmz.charting.security.UserDetailServiceImpl'>
</beans:bean>

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userDetailsService" >

    </authentication-provider>
</authentication-manager>

</beans:beans>
Run Code Online (Sandbox Code Playgroud)

UserDetailServiceImpl:

public class UserDetailServiceImpl implements UserDetailsService{

@Override
public UserDetails loadUserByUsername(String user) throws UsernameNotFoundException {
    System.out.println("In loadUserByUsername:" + user);
    return buildUserFromUserEntity();
 }


private UserDetails buildUserFromUserEntity() {
      // convert model user to spring security user
      String username = "testuser@test.com";
      String password = "testuser";
      boolean enabled = true;
      boolean accountNonExpired = true;
      boolean credentialsNonExpired = true;
      boolean accountNonLocked = true;
      Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
      authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

      UserDetails springUser = new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
      return springUser;
}   
}
Run Code Online (Sandbox Code Playgroud)

日志输出 -

在 loadUserByUsername:testuser@test.com
在 loadUserByUsername:testuser@test.com

为了便于理解,我对用户 ID 和密码值进行了硬编码。