Spring 安全 - 每个匹配器的特定会话创建策略
Spring security - Specific session creation policy per matchers
我正在尝试为 /testMVCController/** 端点实现 SessionCreationPolicy.ALWAYS,为其余端点 (/**) 实现 SessionCreationPolicy.STATELESS。
预期情况:
当访问 /testMVCController/displayUsers 时,用户登录一次,我在 UserDetailsService 中实现的日志记录了与该用户关联的权限。
之后所有对/testMVCController/**下/testMVCController/displayUsers或其他URL的请求都不会再登录权限,因为session创建策略是always,用户已经登录
这在我没有指定第二个安全配置 (X509ClientSessionCreationPolicyStateless) 时有效,但是当我添加它时,所有请求都变成无状态会话。
它不适用于当前的安全配置,因为在我使用我的客户端证书登录后,在 /testMVCController/** 端点(例如 /testMVCController/displayUsers)下执行的任何请求都会咨询 authenticationUserDetailsService 并且浏览器发出的每个文件请求(.js 文件,.css 文件,...)都会记录权限列表,即使在初始登录后也是如此。
因此,如果有 3 个请求(/testMVCController/displayUsers、displayUsers.js、displayUsers.css),authenticationUserDetailsService 中的权限列表将被记录 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.js
、usersList.css
等配置为 SessionCreationPolicy.STATELESS
],在这些情况下,总是会参考 X509CustomUserDetailsService
。
示例:
对 /testMVCController/usersList
的 GET 请求有效,但在此用户列表页面中也有对 usersList.js
、usersList.css
等的请求
所以,一旦我将这些资源路径包含在 antMatchers 中,所有这些都可以正常工作。
我正在尝试为 /testMVCController/** 端点实现 SessionCreationPolicy.ALWAYS,为其余端点 (/**) 实现 SessionCreationPolicy.STATELESS。
预期情况:
当访问 /testMVCController/displayUsers 时,用户登录一次,我在 UserDetailsService 中实现的日志记录了与该用户关联的权限。 之后所有对/testMVCController/**下/testMVCController/displayUsers或其他URL的请求都不会再登录权限,因为session创建策略是always,用户已经登录
这在我没有指定第二个安全配置 (X509ClientSessionCreationPolicyStateless) 时有效,但是当我添加它时,所有请求都变成无状态会话。
它不适用于当前的安全配置,因为在我使用我的客户端证书登录后,在 /testMVCController/** 端点(例如 /testMVCController/displayUsers)下执行的任何请求都会咨询 authenticationUserDetailsService 并且浏览器发出的每个文件请求(.js 文件,.css 文件,...)都会记录权限列表,即使在初始登录后也是如此。
因此,如果有 3 个请求(/testMVCController/displayUsers、displayUsers.js、displayUsers.css),authenticationUserDetailsService 中的权限列表将被记录 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?,
提前致谢!
我遗漏了一些配置细节。我正在捕获对 /testMVCController/**
的所有请求并且它正在工作,但除了捕获对类型 /testMVCController/**
的任何端点的请求(例如:/testMVCController/usersList),我还必须捕获这些页面为获取它们的脚本而提出的请求(.js 文件、.css 文件、.png 文件)。
发生的事情是:对 /testMVCController/usersList
) 的请求配置为 SessionCreationPolicy.ALWAYS
,但后续请求如 usersList.js
、usersList.css
等配置为 SessionCreationPolicy.STATELESS
],在这些情况下,总是会参考 X509CustomUserDetailsService
。
示例:
对 /testMVCController/usersList
的 GET 请求有效,但在此用户列表页面中也有对 usersList.js
、usersList.css
等的请求
所以,一旦我将这些资源路径包含在 antMatchers 中,所有这些都可以正常工作。