0

Я использую функцию spring-security для проверки в профиле пользователей, но мое приложение не делает это хорошо, когда я вижу журнал файлов, это покажет мне следующее:Профиль с spring-security не работает

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> 

класс UserDatailsService

@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

Я столкнулся с той же проблемой при работе с весной безопасности oauth2.

РЕШЕНИЕ

вам нужно сделать несколько изменений в своем классе, который реализует UserDetails (org.springframework.security.core.userdetails), в вашем случае его класс пользователя.

Для следующих преобладающих методов isAccountNonLocked(), isAccountNonExpired(), IsEnabled(), isCredentialsNonExpired() изменить тип Retrun истина (по умолчанию его ложным).

Обратите внимание, что все эти методы должны иметь логику, чтобы возвращать true или false в зависимости от вашего требования, но чтобы сделать работу с вашим кодом, я предлагаю вам вернуть true для всех указанных методов.

Смежные вопросы