0

getDetails を使用して、Authentication オブジェクトから User オブジェクトを取得できないのはなぜだろうと思っていました。getPrincipal を使用してユーザー名のみを取得します。

プロジェクトをデバッグすると、予期していなかった動作が見られました。

Spring 3.2.4.RELEASE を使用しています。

security-app-context.xml には、この構成が含まれています

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder ref="passwordEncoder" />
    </authentication-provider>
</authentication-manager>

私のuserDetailsS​​erviceはこれです

@Service
class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService, InitializingBean {
    @Override
    public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
        try {
            final User search = new User();
            search.setUsername(username);
            final User user = service.get(search, null);
            if (user != null) {
                UserDetailsModel model = new UserDetailsModel(user.getUsername(), user.getPassword(),
                    getGrantedAuthorities(user.getRoles()));
                model.setDetails(user);
                return model;
            }
        } catch (final Throwable th) {
            log.error("", th);
        }
        throw new UsernameNotFoundException("Bad credentials");
    }

ご覧のとおり、詳細は私のサービスからの現在のユーザーデータで設定されています。

ポイントからデバッグし、モデルが返されたら、に戻ります

org.springframework.security.authentication.dao.DaoAuthenticationProvider line 101
org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider line 132

2 番目のクラスの 190 行目に、最後に実行されるメソッド createSuccessAuthentication があります。

protected Authentication createSuccessAuthentication(Object principal, Authentication authentication,
        UserDetails user) {
    // Ensure we return the original credentials the user supplied,
    // so subsequent attempts are successful even with encoded passwords.
    // Also ensure we return the original getDetails(), so that future
    // authentication events after cache expiry contain the details
    UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(principal,
            authentication.getCredentials(), authoritiesMapper.mapAuthorities(user.getAuthorities()));
    result.setDetails(authentication.getDetails());

    return result;
}

198 行目では、結果 (認証) に詳細を追加しますが、提供された UserDetails から取得するのではなく、詳細を含まない認証から取得します。

これは構成の問題ですか、私のせいですか、それとも Spring のバグですか?

4

1 に答える 1

1

getPrincipal() メソッドは、getDetails() メソッドではなく、UserDetails の実装を返します。

于 2013-11-17T17:44:09.927 に答える