私は、スプリングブートとスプリングJavaの設定を使用して、カスタム認証フィルタを使用して2つの異なるhttp Web構成を使用したいと考えています。 サンプルアプリケーションは、https://github.com/spring-projects/spring-security-javaconfig/blob/master/samples-web.md#sample-multi-http-web-configurationにあります。 これは、それぞれのウェブ構成に対して個別のスプリング・フィルター・チェーンで終わると私は理解していました。しかし、両方のフィルタが呼び出されますが、Web設定のurlパターンは要求と一致しません。 たとえば、http://localhost:8080/api/dosomethingを要求すると、CustomApiAuthenticationFilterだけでなく、両方のフィルタが呼び出されます。もちろん、doFilterInternalでリクエストURLを確認し、一致しない場合はリクエストを無視することは可能ですが、これは対応するWeb設定のurlパターンを尊重して自動的に行うべきだと考えました。 さらに、私のRestControllerはそれぞれ呼び出されることはありません。Postmanはレスポンスボディがない状態コード200 OKしか受け取りません。Java Configを使用した複数のHttpSecurityオブジェクトのカスタム認証フィルタ
2つの質問: 1.これは仕様によるものですか、構成が間違っていますか? 2. RestControllerが呼び出されないのはなぜですか?
@EnableWebSecurity
public class SecurityConfiguration {
@Configuration
@Order(1)
public static class ApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Bean
public GenericFilterBean apiAuthenticationFilter() {
return new CustomApiAuthenticationFilter();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**").addFilterAfter(apiAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests().antMatchers("/api/**").authenticated();
}
}
@Configuration
@Order(2)
public static class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
public GenericFilterBean webAuthenticationFilter() {
return new CustomWebAuthenticationFilter();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/").addFilterAfter(webAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class)
.authorizeRequests().antMatchers("/").authenticated();
}
}
}
public class CustomApiAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
Authentication auth = new UsernamePasswordAuthenticationToken("sub", "password", ImmutableList.of(new SimpleGrantedAuthority("API")));
SecurityContextHolder.getContext().setAuthentication(auth);
}
}
public class CustomWebAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
Authentication auth = new UsernamePasswordAuthenticationToken("sub", "password", ImmutableList.of(new SimpleGrantedAuthority("USER")));
SecurityContextHolder.getContext().setAuthentication(auth);
}
}
@RestController
public class ApiController {
@RequestMapping(value = "/api/v1/dosomething", method = RequestMethod.GET)
public String getSomething() {
return "something";
}
}
フィルタはBeanです。 Springブートはそれらを検出し、Spring Securityフィルタチェーンだけでなく、通常のフィルタチェーンに追加します。したがって、おそらく1度ではなく2度呼び出されることさえあります。 –
'OncePerRequestFilter'を拡張すると、それらは一度だけ呼び出されますが、問題はフィルタが通常の' javax.servlet.Filter'として検出され、通常のフィルタとして追加されるという点です。したがって、実行は –
です。さて、 '@ Bean'アノテーションを削除した後、正しいフィルタだけが呼び出されます。しかし、私はまだ私の 'RestController'が呼び出されないという問題があります。何か案は? – oliver