将Spring Security作为通用模块开发并在Spring Boot Micro服务体系结构中将其打开

时间:2016-01-15 06:00:34

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

我有一个带弹簧启动的微服务架构。我决定为每个微服务添加Spring安全性,该服务将进行身份验证,授权用户。

所以我开发了一个具有Spring Security身份验证的独立项目。

我使用了一个扩展AbstractAuthenticationProcessingFilter的过滤器。

我的过滤器类中提到了需要身份验证和授权的路径,如下所示,

private AntPathRequestMatcher[] authenticationMatcher = { 
            new AntPathRequestMatcher("//api/myservice1/**"),
            new AntPathRequestMatcher("/api/myservice") 
            };

private AntPathRequestMatcher[] authorizationMatcher = { 
            new AntPathRequestMatcher("/api/myservice") 
            };

所以在过滤器类doFilter方法中,我检查请求路径并执行相关逻辑。

我的SecurityConfig类配置方法如下所示,

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(getMyAuthenticationFilter(), BasicAuthenticationFilter.class); 
    }

所以我的问题是,

  1. 我应该采取什么方法将这个模块(项目)引入每个微服务?

    我的想法是将它作为jar文件公开,并在任何微服务中使用它。在那种情况下,我怎么能超过那些将针对每个微服务特定的authenticationMatcher和authorizationMatcher网址?

    我是否在正确的位置声明这些网址,如果是,我应该应用哪些面向对象的原则?

  2. 我是否有可能通过验证过滤器(如果需要)并在需要时启用它?喜欢切换它吗?

1 个答案:

答案 0 :(得分:2)

我相信这种方法可以按照您的需要工作,并且可以使用Spring Boot完成。关于你的问题:

  1. 在你的过滤器类中,你可以声明这样的东西,可以通过bean初始化来填充。

    @Value("${security.checkValues}")
    private String[] checkValues;
    

    下面是我自己的自定义过滤器使用的示例,该过滤器被声明为bean并传入安全配置。你可能不需要全部。

    @Configuration
    @Order(3)
    public static class SubscriptionWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
    
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .requestMatchers().antMatchers("/subscribe**","/subscribe/**").and()
                    .addFilterBefore(applicationSecurityTokenFilter(), UsernamePasswordAuthenticationFilter.class)
                    .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                    .httpBasic()
                    .and()
                    .csrf().disable();
        }
    
    
        @Bean
        public ApplicationSecurityTokenFilter applicationSecurityTokenFilter() {
            return new ApplicationSecurityTokenFilter();
        }
    }
    

    然后,微服务中的每个application.properties实例(假设它们是单独的项目)将有如下所示的行来指定要使用的URL。

    security.checkValues=/api/myservice,/api/myservice2
    
  2. 如果包含这样的空字符串属性:

    security.checkValues=
    

    然后将String数组设置为0长度数组,您可以知道它不应该是活动的。我不完全确定这是您的问题引用的内容所以请查看。

  3. 如果您正在寻找,请告诉我。如有必要,我们可以进一步清理它。