【问题标题】:Can spring security specify different UserDetailsService instances for different paths?spring security可以为不同的路径指定不同的UserDetailsS​​ervice实例吗?
【发布时间】:2020-05-17 16:04:23
【问题描述】:

以下代码有误,但希望有一天能支持。

当然,首先要感谢spring security及相关组件的开发者。感谢您让我们如此轻松地编写安全软件。

@Configuration
class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("AdminerDetailsService")
    UserDetailsService adminerDetailsService;

    @Autowired
    @Qualifier("UserDetailsService")
    UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/backend-admin/**").hasRole("REGULAR")
                .userDetailsService(adminerDetailsService)
                .loginProcessingUrl("/login/admin")
                .authorizeRequests()
                .antMatchers("/backend-ContentCentre/**").hasRole("NORMAL")
                .userDetailsService(userDetailsService)
                .loginProcessingUrl("/login/user")
                .anyRequest().permitAll();
    }
}

上面的代码基本说明了我的意图。访问/backend-ContentCentre 的用户使用与访问/backend-admin 不同的UserDetailService 实现。我应该如何配置才能实现这个目标?

非常感谢。

【问题讨论】:

    标签: java spring-boot spring-security java-8


    【解决方案1】:

    您可以将它们放入单独的配置中。不过,它们必须用 @Order 注释:

    @Configuration
    @EnableWebSecurity
    public class SimpleSecurityConfiguration {
    
        @Order(1)
        @Configuration
        public static class AdminConfiguration extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http
                    .antMatcher("/backend-admin/**")
                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
                    .login(login -> login
                        .loginUrl("/login/admin")
                    );
            }
    
            @Override
            protected void configure(AuthenticationManagerBuilder auth) {
                auth.userDetailsService(adminDetailsService);
            }
        }
    
    
        @Order(2)
        @Configuration
        public static class AdminConfiguration extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http
                    .antMatcher("/backend-user/**")
                    .authorizeRequests(authz -> authz.anyRequest().permitAll())
                    .login(login -> login
                        .loginUrl("/login/user")
                    );
            }
    
            @Override
            protected void configure(AuthenticationManagerBuilder auth) {
                auth.userDetailsService(userDetailsService);
            }
        }
    }
    

    注意使用 lambda 来构建登录和授权。此外,问题中提供的代码不允许区分每个路径使用哪个 userService

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-12
      • 2017-10-27
      • 1970-01-01
      • 2012-06-11
      • 2018-10-25
      • 2011-07-26
      • 2013-02-11
      • 1970-01-01
      相关资源
      最近更新 更多