在内存和自定义提供程序中

Xtr*_*ica 13 java spring-security

我正在设置我的Spring Security(v4.0.1)Web应用程序.我希望有两个身份验证提供程序,一个用于管理管理员帐户的"内存"提供程序和一个引用我自己的实现的自定义提供程序.系统应首先尝试针对"内存中"提供程序进行身份验证,然后针对自定义提供程序进行身份验证.我的代码看起来像这样:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth, 
    AuthenticationProvider provider) throws Exception {
    auth.inMemoryAuthentication()
            .withUser("admin")
            .password("s3cr3t")
            .authorities("ADMIN");
    auth.authenticationProvider(provider);
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码使框架首先尝试我的自定义实现.这有点道理,因为该AuthenticationManagerBuilder#authenticationProvider方法将内部列表中的Provider添加到内部列表中AuthenticationManagerBuilder#inMemoryAuthentication.我怎么能设法让它工作?

Ran*_*niz 24

您可以InMemoryUserDetailsManagerConfigurer手动创建并告诉它在完成配置后自行AuthenticationManagerBuilder配置,以便AuthenticationProvider在自定义之前安装它:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth,
        AuthenticationProvider provider) throws Exception {

    inMemoryConfigurer()
        .withUser("admin")
            .password("s3cr3t")
            .authorities("ADMIN")
        .and()
        .configure(auth);
    auth.authenticationProvider(provider);
}

private InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder>
        inMemoryConfigurer() {
    return new InMemoryUserDetailsManagerConfigurer<>();
}
Run Code Online (Sandbox Code Playgroud)

通常情况下会InMemoryUserDetailsManagerConfigurer创建并添加到配置器列表中,这些配置器应该在AuthenticationManager构建时应用- 这是在您安装自定义之后AuthenticationProvider.