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

ha5z0ras  于 2023-01-13  发布在  Spring
关注(0)|答案(1)|浏览(138)

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

    • 预期情景:**

访问/testMVCController/displayUsers时,用户登录一次,我在UserDetailsService中实现的日志记录了与该用户关联的权限,之后所有对/testMVCController/displayUsers/testMVCController/**下其他URL的请求都不会再记录权限,因为会话创建策略为always,并且用户已经登录。
当我没有指定第二个安全配置(X509ClientSessionCreationPolicyStateless)时,这是有效的,但是当我添加它时,所有的请求都变成了无状态会话。
它不适用于当前的安全配置,因为在我使用客户端证书登录后,在/testMVCController/**端点(例如/testMVCController/displayUsers)下执行任何请求时,将查询authenticationUserDetailsService,并为浏览器发出的每个文件请求(. js文件、. css文件等)记录权限列表,即使在初始登录后也是如此。
因此,如果存在3个请求(/testMVCController/displayUsers、displayUsers.js、displayUsers.css),则将3次记录authenticationUserDetailsService中存在的权限日志列表。
我按如下所示配置了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?Spring Session: How to create separate session management policies for different URLs和多个HttpSecurity),但没有一个工作。
先谢了!

vwkv1x7d

vwkv1x7d1#

我的配置缺少一些细节。我捕获了对/testMVCController/**的所有请求,这是有效的,但除了捕获对/testMVCController/**类型的任何端点的请求(例如:/testMVCController/usersList),我还必须捕获这些页面发出的获取脚本(.js文件、.css文件、.png文件)的请求。对X1 M2 N1 X的请求)是用X1 M3 N1 X配置的,但是诸如X1 M4 N1 X、X1 M5 N1 X等的后续请求是用X1 M6 N1 X配置的,并且在这些情况下总是参考X1 M7 N1 X。
示例:对/testMVCController/usersList的GET请求有效,但此用户列表页面中也存在对usersList.jsusersList.css等的请求。
因此,一旦我将这些资源路径包含在antMatchers中,它们就可以完美地工作了。

相关问题