我有一个带弹簧启动的微服务架构。我决定为每个微服务添加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);
}
所以我的问题是,
我应该采取什么方法将这个模块(项目)引入每个微服务?
我的想法是将它作为jar文件公开,并在任何微服务中使用它。在那种情况下,我怎么能超过那些将针对每个微服务特定的authenticationMatcher和authorizationMatcher网址?
我是否在正确的位置声明这些网址,如果是,我应该应用哪些面向对象的原则?
我是否有可能通过验证过滤器(如果需要)并在需要时启用它?喜欢切换它吗?
答案 0 :(得分:2)
我相信这种方法可以按照您的需要工作,并且可以使用Spring Boot完成。关于你的问题:
在你的过滤器类中,你可以声明这样的东西,可以通过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
如果包含这样的空字符串属性:
security.checkValues=
然后将String数组设置为0长度数组,您可以知道它不应该是活动的。我不完全确定这是您的问题引用的内容所以请查看。
如果您正在寻找,请告诉我。如有必要,我们可以进一步清理它。