我正在使用Spring Security 3.我有自己的身份验证提供程序。
这是我到目前为止所做的:
安全应用程式内-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表对象。
我错过了什么?
答案 0 :(得分:2)
仅仅因为返回UserDetails并不意味着您将被验证。 DaoAuthenticationProvider进行了大量检查,以确保应该对返回的用户进行身份验证。例如,它确保用户名和密码匹配,帐户未过期,帐户未锁定等。常见问题是返回不包含任何GrantedAuthority的UserDetails,导致UsernamePasswordAuthenticationToken表明用户不是认证
您是否尝试过为org.springframework.security启用调试日志记录?这可能解释了什么是错的。如果您不熟悉日志记录,Spring(和Spring Security)会使用commons-logging,您可以在Spring参考中找到logging guide。
PS如UserDetailsService接口中所述,loadUserByUsername永远不应返回null。而是抛出UsernameNotFoundException
答案 1 :(得分:0)
由于Users
类正在实现UserDetails
接口,因此请确保从getAuthorities方法返回GrantedAuthority
列表而不是null。此外,其他验证方法应返回适当的值以指示用户有效。例如:
@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;
}