0

Spring Security 3 を使用しています。独自の認証プロバイダーがあります。

これが私がこれまでに持っているものです:

security-app-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);
    }
}

このコードは単純な例です。「// THIS WORKS...」の時点で、Users私たちのデータベースからの記録があります。しかし、このオブジェクトを返すと、まだ認証されていません。

Usersは Hibernate テーブル オブジェクトであることに注意してください。

私は何が欠けていますか?

4

2 に答える 2

2

UserDetails が返されたからといって、認証されるわけではありません。DaoAuthenticationProvider は、返されたユーザーが認証されていることを確認するために、いくつかのチェックを行います。たとえば、ユーザー名とパスワードが一致すること、アカウントの有効期限が切れていないこと、アカウントがロックされていないことなどを確認します。よくある問題は、GrantedAuthority を含まない UserDetails を返すことです。認証済み。

org.springframework.security のデバッグ ロギングを有効にしてみましたか? これは何が間違っているかを説明するかもしれません。ロギングに慣れていない場合、Spring (および Spring Security) は commons-logging を使用し、Spring リファレンスでロギング ガイドを見つけることができます。

PS UserDetailsS​​ervice インターフェイスに記載されているように、loadUserByUsernameは決して null を返すべきではありません。代わりに UsernameNotFoundException をスローします

于 2012-06-07T15:46:53.823 に答える
0

UsersクラスはUserDetailsインターフェイスを実装しているため、getAuthorities メソッドから null ではなくリストを返すようにしてくださいGrantedAuthority。また、他の検証メソッドは、ユーザーが有効であることを示す適切な値を返す必要があります。例えば:

@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;
}
于 2012-06-08T00:54:14.587 に答える