代码之家  ›  专栏  ›  技术社区  ›  dave

如何配置Spring web应用程序以在每个端点使用不同的身份验证方法[已关闭]

  •  -1
  • dave  · 技术社区  · 6 年前

    我有一个使用Java、Spring和Spring Security构建的web应用程序,它需要支持两种不同的身份验证方法。我遇到的困难是,我想在一组控制器端点上使用一种身份验证方法,在其余端点上使用另一种方法。

    这是一个困难,因为我所阅读的关于多个身份验证提供者的所有文档似乎都假设您希望所有提供者都应用于所有端点,并且您遍历提供者,直到找到一个将对用户进行身份验证的提供者。

    我使用的是Java注释基础配置(与XML配置相反)。以下是我探索过但没有成功的几种方法:

    • 使用模式匹配器配置提供程序以限制其应用的端点
    • 将提供程序配置为仅针对某些身份验证类型触发,例如,如果存在摘要凭据,则触发基于摘要的身份验证提供程序

    有谁能建议最好的方法是什么?上述方法之一正确吗(我只是弄错了)?还是有其他更喜欢的方式?

    (我知道我没有为某个问题提供具体的代码来审查。这是因为我只需要在春季获得关于正确做事方式的指导。)

    1 回复  |  直到 6 年前
        1
  •  1
  •   ArmedChef    6 年前

    我使用的是Spring Boot 2.0。我不知道最好的方法是什么,但这里有一种方法对我有效。我必须将其划分为不同的配置类,第二个配置需要 @订单号 上面的批注。

    对于我的特殊情况,我需要一些由HTTP基本身份验证(用户名/密码)保护的管理REST方法,其余的REST方法需要由自定义逻辑保护。

    @Configuration
    @EnableWebSecurity
    public class TestSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().permitAll();
    
            // anything that is NOT /admin/**
            RequestMatcher requestMatcher = new NegatedRequestMatcher(new AntPathRequestMatcher("/admin/**", "GET"));
    
            // MyCustomFilter is my class that performs custom authentication logic
            http.requestMatcher(requestMatcher)
                .addFilterAfter(new MyCustomFilter(), BasicAuthenticationFilter.class);
        }
    
    
        @Order(1)
        @Configuration
        public static class AdminServiceConfiguration extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                //this time anything that IS /admin/**
                http.requestMatchers()
                    .antMatchers("/admin/**").and()
                    .httpBasic().and()
                    .authorizeRequests().antMatchers("/admin/**").fullyAuthenticated();
            }
    
            @Override
            protected void configure(AuthenticationManagerBuilder authBuilder) throws Exception {
                authBuilder.inMemoryAuthentication()
                    .passwordEncoder(NoOpPasswordEncoder.getInstance())
                    .withUser("username")
                    .password("password")
                    .roles("ADMIN");
            }
        }
    }