我尝试为/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),但没有一个工作。
先谢了!
1条答案
按热度按时间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.js
、usersList.css
等的请求。因此,一旦我将这些资源路径包含在antMatchers中,它们就可以完美地工作了。