2012-06-07 5 views
0

Я использую Spring Security 3. У меня есть собственный провайдер аутентификации.Почему мое loadUserByUsername не работает?

Вот то, что я до сих пор:

безопасности приложение-context.xml

<authentication-manager> 
    <authentication-provider user-service-ref="detailsService" />  
</authentication-manager> 

<beans:bean id="loginSuccessHandler" class="com.myapp.security.LoginSuccessHandler" /> 
<beans:bean id="loginFailureHandler" class="com.myapp.security.LoginFailureHandler" /> 
<beans:bean id="detailsService" class="com.myapp.security.UserDetailService" /> 

UserDetailService

public class UserDetailService implements UserDetailsService { 

    private DataSource dataSource; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     String hql = "from Users where username = :username"; 

     List<Users> list = null; 

     try { 
      IO io = new IO("common_web"); 
      IOQuery query = new IOQuery(); 
      query.setStatement(hql); 
      query.setParameter(new IOParameter("username", username)); 

      list = io.runQuery(query); 

      if (list.isEmpty()) { 
       return null; 
      } 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     // THIS WORKS. I HAVE A VALID USER FROM DB 
     return (UserDetails) list.get(0); 
    } 
} 

Этот код всего лишь простой пример. В разделе «// ЭТО РАБОТЫ ...» У меня есть запись Users из нашей базы данных. Но когда я возвращаю этот объект, я до сих пор не аутентифицирован.

Обратите внимание, что Users является объектом таблицы Hibernate.

Что мне не хватает?

ответ

2

Просто потому, что возвращается UserDetails, это не означает, что вы будете аутентифицированы. DaoAuthenticationProvider выполняет ряд проверок, чтобы гарантировать, что возвращаемый пользователь должен быть аутентифицирован. Например, он гарантирует совпадение имени пользователя и пароля, срок действия учетной записи не истек, учетная запись не заблокирована и т. Д. Общей проблемой является возврат UserDetails, который не содержит каких-либо GrantedAuthority, из-за чего вызывается UserPasswordAuthenticationToken, который указывает, что пользователь не является проверку подлинности.

Вы пробовали включить ведение журнала отладки для org.springframework.security? Это может объяснить, что не так. Если вы не знакомы с протоколированием, Spring (и Spring Security) используют commons-logging, и вы можете найти logging guide в ссылке Spring.

PS Как указано в интерфейсе UserDetailsService, loadUserByUsername никогда не должен возвращать значение null. Вместо этого введите UsernameNotFoundException

+0

+1 Спасибо, что указали на не возвращающийся нуль. – cbmeeks

0

С Users класс реализует интерфейс UserDetails, убедитесь, что вы возвращаете список GrantedAuthority вместо null из метода getAuthorities. Кроме того, другие методы проверки должны возвращать соответствующие значения, чтобы указать, что пользователь действителен. Например:

@Override 
public List<GrantedAuthority> getAuthorities() { 

    return AuthorityUtils.createAuthorityList("VALID_USER_ROLE"); 
} 
@Override 
public boolean isAccountNonExpired() { 
    return true; 
} 

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

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

@Override 
public boolean isEnabled() { 
    return true; 
} 
Смежные вопросы