Spring 安全 - 每个匹配器的特定会话创建策略

Spring security - Specific session creation policy per matchers

我正在尝试为 /testMVCController/** 端点实现 SessionCreationPolicy.ALWAYS,为其余端点 (/**) 实现 SessionCreationPolicy.STATELESS。

预期情况:

当访问 /testMVCController/displayUsers 时,用户登录一次,我在 UserDetailsS​​ervice 中实现的日志记录了与该用户关联的权限。 之后所有对/testMVCController/**下/testMVCController/displayUsers或其他URL的请求都不会再登录权限,因为session创建策略是always,用户已经登录

这在我没有指定第二个安全配置 (X509ClientSessionCreationPolicyStateless) 时有效,但是当我添加它时,所有请求都变成无状态会话。

它不适用于当前的安全配置,因为在我使用我的客户端证书登录后,在 /testMVCController/** 端点(例如 /testMVCController/displayUsers)下执行的任何请求都会咨询 authenticationUserDetailsS​​ervice 并且浏览器发出的每个文件请求(.js 文件,.css 文件,...)都会记录权限列表,即使在初始登录后也是如此。

因此,如果有 3 个请求(/testMVCController/displayUsers、displayUsers.js、displayUsers.css),authenticationUserDetailsS​​ervice 中的权限列表将被记录 3 次。

我按如下所示配置了 SecurityConfiguration,但它不起作用:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
public class SecurityConfiguration {

 @Configuration
 @Order(1)
 public static class X509ClientSessionCreationPolicyAlways extends WebSecurityConfigurerAdapter {

      @Autowired
      private X509CUDService x509CUDService;

      @Override
      protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      }

      @Override
      protected void configure(HttpSecurity http) throws Exception {
           http
                .antMatcher("/testMVCController/**")
                .csrf().disable()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .x509()
                .authenticationUserDetailsService(x509CUDService)
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS);
      }

 }

 @Configuration
 @Order(2)
 public static class X509ClientSessionCreationPolicyStateless extends WebSecurityConfigurerAdapter {

      @Autowired
      private X509CUDService X509CUDService ;

      @Override
      protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      }

      @Override
      protected void configure(HttpSecurity http) throws Exception {
           http
                .antMatcher("/**")
                .csrf().disable()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .x509()
                .authenticationUserDetailsService(X509CUDService);
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
      }

      @Override
      @Bean
      public AuthenticationManager authenticationManagerBean() throws Exception {
           return super.authenticationManagerBean();
      }

 }

}

我搜索了这个问题并找到了各种链接(例如 Spring session creation policy per-request?, and Multiple HttpSecurity),但其中 none 有效。

提前致谢!

我遗漏了一些配置细节。我正在捕获对 /testMVCController/** 的所有请求并且它正在工作,但除了捕获对类型 /testMVCController/** 的任何端点的请求(例如:/testMVCController/usersList),我还必须捕获这些页面为获取它们的脚本而提出的请求(.js 文件、.css 文件、.png 文件)。 发生的事情是:对 /testMVCController/usersList) 的请求配置为 SessionCreationPolicy.ALWAYS,但后续请求如 usersList.jsusersList.css 等配置为 SessionCreationPolicy.STATELESS ],在这些情况下,总是会参考 X509CustomUserDetailsService

示例: 对 /testMVCController/usersList 的 GET 请求有效,但在此用户列表页面中也有对 usersList.jsusersList.css 等的请求

所以,一旦我将这些资源路径包含在 antMatchers 中,所有这些都可以正常工作。