java - Spring Security 重新创建 HttpSession
问题描述
我尝试配置 Spring Security,但我遇到了一个问题。
这是我的 SessionAuthenticationFilter:
public class SessionAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (nonNull(user)) {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(user.getRole());
Authentication authentication = new UsernamePasswordAuthenticationToken(user.getName(), null, singletonList(authority));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
}
这是我的安全配置:
@Configuration
@EnableWebSecurity
@EnableJdbcHttpSession
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public SessionAuthenticationFilter sessionFilter() {
return new SessionAuthenticationFilter();
}
@Bean
public HttpSessionIdResolver httpSessionIdResolver() {
return HeaderHttpSessionIdResolver.xAuthToken();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin().disable()
.cors()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(sessionFilter(), SessionManagementFilter.class)
.authorizeRequests()
.antMatchers(
"/login"
)
.permitAll()
.anyRequest()
.authenticated();
}
}
这是我的索引控制器:
@RestController
public class IndexController {
@RequestMapping(value = "/index", method = RequestMethod.GET)
public ResponseEntity<?> index(HttpSession session) {
System.out.println(session.getId());
return new ResponseEntity<>(HttpStatus.OK);
}
}
里面的 SessionAuthenticationFilter HttpSession 是正确的,但是当我尝试获取这个会话时,我会得到其他会话。为什么?我知道这是由 Spring Security 创建的。它是如何固定的?
解决方案
您的问题可能与此有关:.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
因此,在 Spring Security Docs 中,Spring Security 永远不会创建HttpSession
并且永远不会使用它来获取SecurityContext
会话创建策略设置为的时间STATELESS
。
尝试将政策更改为SessionCreationPolicy.ALWAYS
推荐阅读
- kubeflow - 如何在 kubeflow 中跨多个组件使用 OutputPath
- android - 按下输入框中的箭头时显示自定义视图。(在本机反应中)
- regex - 尝试匹配分隔符之间的字符
- visual-studio - 在 Windows 安全模式下运行 Visual Studio
- python - 捕获 TypeError:缺少 1 个必需的位置参数:'self'
- apache-kafka - Kafka max.in.flight.request.per.connection
- python - 如何在对象格式下的列中将冗长的空格替换为 Nan?在蟒蛇
- google-cloud-platform - GCP 项目/YouTube 数据 API 项目过时阻塞?
- c++ - 如何在 C++ 中拥有一个占用 0 个字节的虚函数的基类?
- amazon-web-services - 通过 AutoScaling 组启动的 EC2 实例会自动快速排空