不同端点的多个用户详细信息服务

rod*_*fus 4 spring spring-security basic-authentication spring-boot

我正在使用 Spring 构建 REST API,并且目前正在使用自定义用户详细信息服务和以下配置代码对我的所有请求进行身份验证:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
Run Code Online (Sandbox Code Playgroud)

我还设置了一个DaoAuthenticationProvider使用我的用户详细信息服务并使用它来配置全局安全性。

现在,我想提供一个端点(虽然仍然使用 HTTP 基本身份验证进行保护)使用不同的用户详细信息服务来检查是否允许用户访问给定资源。

如何为不同的端点使用两种不同的用户详细信息服务?

jzh*_*aux 8

你可以做的一件事是有两个WebSecurityConfigurerAdapter

@EnableWebSecurity
@Order(Ordered.HIGHEST_PRECEDENCE)
class FirstEndpointConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) {
        http
            .requestMatchers()
                .antMatchers("/specialendpoint")
                .and()
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.userDetailsService(/* first of your userDetailsServices */);
    }
}


@Configuration
class SecondEndpointConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) {
        http // all other requests handled here
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.userDetailsService(/* second of your userDetailsServices */);
    }
}
Run Code Online (Sandbox Code Playgroud)

requestMatchers()存在用于将springSecurityFilterChains定位到特定端点。

编辑:Mahmoud Odeh 提出了一个很好的观点,如果用户群相同,那么您可能不需要多个UserDetailsService实例。相反,您可以使用一项更改,通过用户帐户的权限隔离您的特殊端点:

@EnableWebSecurity
@Order(Ordered.HIGHEST_PRECEDENCE)
class FirstEndpointConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) {
        http
            .requestMatchers()
                .antMatchers("/specialendpoint")
                .and()
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.userDetailsService(/* first of your userDetailsServices */);
    }
}


@Configuration
class SecondEndpointConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) {
        http // all other requests handled here
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.userDetailsService(/* second of your userDetailsServices */);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您的单身人士UserDetailsService将查找所有用户。这将包括SPECIAL GrantedAuthorityUserDetails实例谁可以接触到用户/specialendpoint

  • 谢谢,我明白了...我已经在[这里]分享了它(https://github.com/freddy-daniel/spring-boot-server-multiple-login-rules) (2认同)