2

WebアプリでLDAPを使用したSpringセキュリティを使用してログイン用の成功ハンドラーを実装しようとしました。オンラインで検索した後、私が見つけた唯一の方法は、次のようなカスタムユーザー詳細マッパーを実装することでした。

public class CustomUserDetailsMapper extends LdapUserDetailsMapper{

private static final String ROLE_NORMAL_USER = "Normal User";
private static final String ROLE_ADMIN = "Administrator";
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx,
        String username, Collection<? extends GrantedAuthority> authority) {
    UserDetails originalUser = super.mapUserFromContext( ctx, username, authority );


    originalUser.getAuthorities();

    Set<AndaAuthority> roles = EnumSet.noneOf(AndaAuthority.class);

    roles.add(AndaAuthority.ROLE_ADMIN);

    for (GrantedAuthority auth : authority) {
        if (ROLE_NORMAL_USER.equalsIgnoreCase(auth.getAuthority())) {
            roles.add(AndaAuthority.ROLE_USER);
        } else if (ROLE_ADMIN.equalsIgnoreCase(auth.getAuthority())) {
            roles.add(AndaAuthority.ROLE_ADMIN);
        }
    }

    SecurityContextHolder.getContext().getAuthentication().getCredentials();

    User newUser = 
            new User( 
            originalUser.getUsername(), 
            originalUser.getPassword() != null? originalUser.getPassword():"", 
            originalUser.isEnabled(), 
            originalUser.isAccountNonExpired(), 
            originalUser.isCredentialsNonExpired(), 
            originalUser.isAccountNonLocked(), 
            roles );

            return newUser;
}
}

これは機能していました。ここにブレークポイントを設定すると、停止しました。しかし、そのような場合のハンドラーを実装するためのより良い方法はありますか?つまり、認証部分全体が「内部」で行われ、何かがうまくいかず、このメソッドが呼び出されない場合、実際にデバッグすることはできません。途中でどこがうまくいかなかったかを知る方法は他にありません。

ありがとうございました

4

1 に答える 1

1

他の人が疑問に思っている場合:Springセキュリティ構成でリンクできるように、成功ハンドラーをBeanとして宣言する必要があります。

ここからの実装は うまく機能authentication-success-handler-refします。構成タグでを宣言し、メソッド<form-login>をオーバーライドするだけです。onAuthenticationSuccess

他のより良い解決策が存在するかもしれませんが、これは私が見つけて私の場合に働いたものです。

于 2012-10-15T08:10:00.893 に答える