30

現在、アプリケーションには、認証と承認に LDAP を使用する単一の認証メカニズムがあります。私のセキュリティ設定は次のようになります

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and()
            .httpBasic();
}

@Configuration
protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {

    @Value("${ldap-${env}.manager.dn}")
    private String managerDn;

    @Value("${ldap-${env}.manager.pass}")
    private String managerPass;

    @Value("${ldap-${env}.server.url}")
    private String url;

    @Value("${ldap.password.attribute:userPassword}")
    private String passwordAttr;

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication().userDnPatterns("uid={0},ou=people").groupSearchBase("ou=groups")
                .groupSearchFilter("(member={0})").userSearchBase("ou=people").userSearchFilter("(uid={0})")
                .userDetailsContextMapper(new CustomLdapPersonContextMapper())
                // .passwordCompare()
                // .passwordAttribute(passwordAttr)
                // .passwordEncoder(new PlaintextPasswordEncoder())
                // .and()
                .contextSource().managerDn(managerDn).managerPassword(managerPass).url(url);
    }
}
}

ただし、ユーザーがセッション キー サーバーから認証できるセッション トークンを受け取り、有効なトークンがユーザー名を返し、それを使用して LDAP からそのユーザーの認証情報をロードできる場合があります。したがって、セッション トークンが http ヘッダーに存在する場合はトークン認証を実行し、次に ldap ルックアップを実行し、セッション トークンが存在しない場合は現在の認証メカニズムに落ちる必要があります。この 2 番目の認証レイヤーを追加するにはどうすればよいですか。

4

4 に答える 4

1

mclemaの答えに追加したいだけです。認証を成功させるためにオーバーライドを追加してフィルターチェーンを続行する必要がある場合があります。そうしないと、ユーザーは元の URL ではなくデフォルトの URL (「/」) にリダイレクトされます (例: /myrest/server/somemethod)。

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
        Authentication authResult) throws IOException, ServletException {
    SecurityContext context = SecurityContextHolder.createEmptyContext();
    context.setAuthentication(authResult);
    SecurityContextHolder.setContext(context);
    chain.doFilter(request, response);
}
于 2016-11-10T21:43:15.350 に答える