0

我使用彈簧安全來驗證用戶的功能其配置文件,但我的應用程序不會很好,當我看到文件日誌,它告訴我這個:彈簧安全配置文件不工作

DEBUG DaoAuthenticationProvider的時候:308 - 用戶帳戶被鎖定

在我的表單登錄我把數據很好,但我從來沒有傳遞到其他頁面,I'm總是在同一個頁面(表單頁面),我介紹好的或壞的數據

我的代碼是:

文件配置彈簧的security.xml

<beans:beans xmlns:security="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-3.1.xsd 
         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <security:http auto-config="true" access-decision-manager-ref="accessDecisionManager"> 
     <security:intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 

     <security:intercept-url pattern="/init" access="PROFILE_ADMINISTRATOR" /> 

     <security:form-login 
      login-page="/" 
      default-target-url="/init" 
      always-use-default-target='true' 
      authentication-failure-url="/"/> 

     <security:http-basic /> 

    </security:http> 

    <security:authentication-manager alias="autenticationManagerUserService"> 
     <security:authentication-provider user-service-ref="userService"> 
      <security:password-encoder hash="md5"/> 
     </security:authentication-provider> 
    </security:authentication-manager> 

    <beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> 

     <beans:property name="decisionVoters"> 
      <beans:list> 
       <beans:ref bean="decisorDeRoles"/> 
       <beans:ref bean="decisorDeAutenticacion"/> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

    <beans:bean id="decisorDeRoles" class="org.springframework.security.access.vote.RoleVoter"> 
     <beans:property name="rolePrefix" value="PROFILE_"/> 
    </beans:bean> 

    <beans:bean id="decisorDeAutenticacion" class="org.springframework.security.access.vote.AuthenticatedVoter"/> 

    <beans:bean id="loggerListener" class="org.springframework.security.authentication.event.LoggerListener"/> 

</beans:beans> 

類UserDatailsS​​ervice的

@Service("userService") 
public class SecurityAuthenticationProvider implements UserDetailsService 
{ 
UserDao userDao = new UserDao(); 

    @Override 
    public UserDetails loadUserByUsername (String username) throws UsernameNotFoundException, DataAccessException 
    { 
     User user = null; 
     List<User> users = userDao.getUser (username); 
     if (users.size() == 0) 
     { 
      throw new UsernameNotFoundException (""); 
     } 
     else 
     { 
      user = users.get (0); 
      user.setAuthorities (userDao.getProfileUser (username)); 
      return user; 
     } 
    } 
} 

類UserDatails

public class User implements UserDetails 
{  
    private List<GrantedAuthority> profiles; 

    private String username; 
    private String password; 
    private boolean accountNonExpired; 
    private boolean accountNonLocked; 
    private boolean credentialsNonExpired; 
    private boolean enabled; 

    @Override 
    public Collection<? extends GrantedAuthority> getAuthorities() 
    { 
     return profiles; 
    } 

    @SuppressWarnings("unchecked") 
    public void setAuthorities (List<? extends GrantedAuthority> profiles) 
    { 
     this.profiles = (List<GrantedAuthority>) profiles; 
    } 

    @Override 
    public String getPassword() 
    { 
     return password; 
    } 

    @Override 
    public String getUsername() 
    { 
     return username; 
    } 

    @Override 
    public boolean isAccountNonExpired() 
    { 
     return accountNonExpired; 
    } 

    @Override 
    public boolean isAccountNonLocked() 
    { 
     return accountNonLocked; 
    } 

    @Override 
    public boolean isCredentialsNonExpired() 
    { 
     return credentialsNonExpired; 
    } 

    @Override 
    public boolean isEnabled() 
    { 
     return enabled; 
    } 

    public void setUsername (String username) 
    { 
     this.username = username; 
    } 

    public void setPassword (String password) 
    { 
     this.password = password; 
    } 

    public void setAccountNonExpired (boolean accountNonExpired) 
    { 
     this.accountNonExpired = accountNonExpired; 
    } 

    public void setAccountNonLocked (boolean accountNonLocked) 
    { 
     this.accountNonLocked = accountNonLocked; 
    } 

    public void setCredentialsNonExpired (boolean credentialsNonExpired) 
    { 
     this.credentialsNonExpired = credentialsNonExpired; 
    } 

    public void setEnabled (boolean enabled) 
    { 
     this.enabled = enabled; 
    } 

} 

類的GrantedAuthority

public class Profile implements GrantedAuthority 
{ 
    private String profile; 

    @Override 
    public String getAuthority() 
    { 
     return profile; 
    } 

    public String getProfile() 
    { 
     return profile; 
    } 

    public void setProfile (String profile) 
    { 
     this.profile = profile; 
    } 

} 
我創建模擬訪問數據庫(以獲得數據)

public class UserDao 
{ 

    public List<? extends GrantedAuthority> getProfileUser (String name) 
    { 
     List<GrantedAuthority> listGrantedAuthorities = new ArrayList<GrantedAuthority>(); 
     Profile profile = new Profile(); 
     profile.setProfile ("PROFILE_ADMINISTRATOR"); 
     listGrantedAuthorities.add (profile); 
     return listGrantedAuthorities; 
    } 

    public List<User> getUser (String name) 
    { 
     List<User> listUser = new ArrayList<User>(); 
     User user = new User(); 
     user.setUsername ("Admin"); 
     user.setPassword ("1234"); 
     // user.setAccountNonExpired (true); 
     // user.setAccountNonLocked (true); 
     // user.setCredentialsNonExpired (true); 
     // user.setEnabled (true); 
     listUser.add (user); 

     return listUser; 
    } 

} 

由於

類。

+0

您的UserDetails實現存在缺陷。布爾值的默認值爲'false',所以方法'isAccountNonLocked'返回false,表示用戶被阻止。 –

+0

抱歉,但我不明白!如果我取消評論的評論,我也有同樣的錯誤: 'DEBUG DaoAuthenticationProvider:308 - 用戶帳戶被鎖定,「 它可能是什麼? – Ltcs

+0

Spring Security使用這些方法進行檢查,如果它們被錯誤地實現,它將無法工作。 –

回答

1

我在使用rest oauth2 spring security時遇到了同樣的問題。

SOLUTION

你需要在你的類,它實現的UserDetails(org.springframework.security.core.userdetails),少數發生在你的情況下,它的用戶類別。 (),isCredentialsNonExpired() 將逆向類型更改爲true(默認爲false)。

請注意,這些所有方法應該有一個邏輯來根據您的要求返回true或false,但爲了使您的代碼正常工作,我建議您爲所有提到的方法返回true。