2016-01-15 33 views
3

我有一个带有弹簧引导的微服务体系结构。我决定为每个微服务添加Spring安全性,以便对用户进行身份验证和授权。将Spring Security作为通用模块开发并在Spring Boot微服务体系结构中开放

因此,我开发了一个单独的项目,并拥有Spring Security认证。

我使用了一个扩展AbstractAuthenticationProcessingFilter的Filter。

这就需要身份验证和授权的路径在下面我的过滤器类中提到,

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 url?

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

  2. 如果需要,是否有可能通过验证过滤器并在需要时启用它?像切换它?

+0

你为什么不在每一个微服务本身做?每个服务都有特定的安全路径,所以基本上这个库会引入每个服务的依赖关系,这与微服务的目的相矛盾。 – dunni

+0

感谢您的建议。但是我的意思是当这个库导入到一个特定的微服务时,那么我需要初始化这些AntPathRequestMatcher变量,只针对那个微服务请求路径。可能最初该库AntPathRequestMatcher变量可以设置为null。所以基本上我试图做的是将该库作为服务,以便任何微服务都可以在需要身份验证和继续执行的微服务中初始化它的特定请求路径。希望你明白了我的观点 – Harshana

+1

您是使用Spring Cloud还是Netflix服务,如Eureka,Zuul等?我使用预过滤器实现了Zuul Edge服务。外部请求无法访问所有内部微服务。 Zuul服务使用Spring Session将经过身份验证的会话外部化到Redis数据库。所有微服务都使用Spring Session进行配置,所有请求都可以访问用户的身份验证会话。您可以轻松地使用每个微服务中的注释来保护路径。 – Bal

回答

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实例(假设它们是独立的项目)将有类似下面一行到指定的网址使用。

    security.checkValues=/api/myservice,/api/myservice2 
    
  2. 如果你有一个空字符串属性是这样的:

    security.checkValues= 
    

    则该字符串数组将被设置为0长度的数组,你可以知道,它不应该是积极的。我不完全确定这是你的问题所引用的,所以请查阅。

让我知道这是你在找什么。如有必要,我们可以进一步冲洗。

相关问题