spring-security 内存中和自定义提供程序

6ioyuze2  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(132)

我正在设置我的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);
}

然而,这段代码会让框架先尝试我的自定义实现。这有点道理,因为AuthenticationManagerBuilder#authenticationProvider方法将Provider添加到内部List,而AuthenticationManagerBuilder#inMemoryAuthentication方法在内部配置它。我如何才能让它工作呢?

w7t8yxp5

w7t8yxp51#

您可以手动创建您的InMemoryUserDetailsManagerConfigurer,并告诉它在您完成配置后在AuthenticationManagerBuilder上进行自我配置,以便它在您的自定义AuthenticationProvider之前安装它的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<>();
}

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

yi0zb3m4

yi0zb3m42#

spring.io Documentation相差不大
如果您使用XML配置(例如spring-security.xml):

<security:authentication-manager>
    <security:authentication-provider ref="FirstProvider" />
    <security:authentication-provider ref="SecondProvider" />
</security:authentication-manager>

(我将该设置用于Spring的一个内置身份验证提供程序,紧挨着一个自定义身份验证提供程序,工作正常)
如果您使用的是JavaConfig,我只能引用其他人的帖子maclema on Java config for multiple authentication provider,因为我从来没有(成功地)尝试过代码config

jgzswidk

jgzswidk3#

现在我们倾向于通过WebSecurityConfigurerAdapter来配置Spring Security,您可以注册从请求中提取凭证的过滤器,并注册使用过滤器构建的令牌的提供者,方法是使用其他详细信息(如权限)填充Authentication对象:

@Override
protected void configure(HttpSecurity http) throws Exception {
    AbstractPreAuthenticatedProcessingFilter tokenPreAuthProcessingFilter = new RequestHeaderAuthenticationFilter();
    http.addFilterAfter(tokenPreAuthProcessingFilter, SecurityContextPersistenceFilter.class);
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    // First.
    auth.authenticationProvider(new PreAuthenticatedAuthenticationProvider());

    // Second.
    auth.inMemoryAuthentication()
            .passwordEncoder(NoOpPasswordEncoder.getInstance())
            .withUser(...);
}

相关问题