我们有一个微服务架构,带有JWT的前后证券,以及HTTP Basic的背对背安全性。
这是我们的JWT配置类:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requestMatchers()
.antMatchers(endpointsProperties.getJwtWithWildcard())
.and()
.csrf().disable()
.authorizeRequests().anyRequest().authenticated()
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);
}
jwtFilter是一个简单的过滤器,它读取Authorization标头,并设置SecurityContextHolder。
和HTTP Basic:
@Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception {
for (Map<String, String> userData : properties.getUsers()) {
auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance())
.withUser(userData.get("login")).password(userData.get("password")).authorities(BASIC_AUTH_AUTHORITY);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatchers().antMatchers(endpoints.getBasicWithWildcard() )
.and().csrf().disable()
.authorizeRequests().anyRequest().authenticated()
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().httpBasic();
}
这些配置类用于不同的服务,具有不同的JWT和HTTP Auth端点。它们可以同时使用,也可以单独使用。 EndpointsProperties从application.yml加载。
但是现在,我们有一些参考微服务,我们希望通过其他服务或由(web)前端应用程序直接到达。我们想知道是否可以使用两种不同的方法保护相同的URL(例如'/ api / referential')。将这些配置类与相同的端点组合起来不起作用,并且似乎一个配置会擦除另一个配置。
是否可以使用不同的方法保护相同的URL路径?如果是,我们需要更改什么来启用它?
感谢您的支持。
我想你可以按顺序将两个过滤器添加到过滤器链中
并确保ignoreFailure
的BasicAuthenticationFilter
属性设置为true
。
这将使basicAuthFilter使用basicAuth对请求进行身份验证,如果没有发送basicAuth,则继续沿着过滤器链继续 - 从而委托给JwtFilter。
然后从.httpBasic()
中删除WebsecurityConfig
- 因为它会尝试添加另一个BasicSecurityFilter。
只是一个关闭袖口的想法