Spring Boot 3 更新后:手动验证用户不起作用

问题描述 投票:0回答:2

我正在将应用程序升级到 Spring Boot 3。我们使用自定义身份验证框架,在对用户进行身份验证后手动设置身份验证对象。

用户登录后,我们调用

SecurityContextHolder.getContext().setAuthentication(authentication);
。这在以前的 Spring Boot/Security 版本中可以正常工作,没有问题。但是,升级后
SecurityContextHolder.getContext().getAuthentication()
返回的是AnonymousAuthenticationToken,而不是我们使用的、需要对用户进行身份验证和授权的Token。奇怪的是,第一次检查身份验证时,它包含正确的令牌,但之后每次我调用
SecurityContextHolder.getContext().getAuthentication()
时,它都会返回 AnonymousAuthenticationToken。

有人经历过类似的事情吗?这是一个 Vaadin 应用程序,如果它有所作为的话。

我在 spring 文档中找到了以下提示:

例如以下代码:

SecurityContextHolder.setContext(securityContext);
应替换为
SecurityContextHolder.setContext(securityContext); securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);

但是,这对我来说并不是真正有用,因为这是一个 Vaadin 应用程序,我自己不处理任何请求。

spring spring-boot spring-security vaadin vaadin24
2个回答
5
投票

来自https://docs.spring.io/spring-security/reference/5.8/migration/servlet/session-management.html#_require_explicit_ saving_of_securitycontextrepository

在 Spring Security 6 中,默认行为是 SecurityContextHolderFilter 只会从 SecurityContextRepository 读取 SecurityContext 并将其填充到 SecurityContextHolder 中。如果用户希望 SecurityContext 在请求之间持续存在,则现在必须使用 SecurityContextRepository 显式保存 SecurityContext。只需在必要时写入 SecurityContextRepository(即 HttpSession)即可消除歧义并提高性能。

听起来你应该像你提到的那样打电话给

securityContextRepository.saveContext(securityContext, httpServletRequest, httpServletResponse);
。在 Vaadin 应用程序中,您可以使用
VaadinServletRequest.getCurrent()
VaadinServletResponse.getCurrent()

获取请求和响应

0
投票

实际上你只需要:

  1. 接下来添加到您的控制器类: 私有最终 SecurityContextRepository securityContextRepository = new HttpSessionSecurityContextRepository();

  2. 将三个元素添加到您的端点签名中: 安全上下文当前上下文, HttpServletRequest 请求,HttpServletResponse 响应

  3. 执行端点主体中的代码:

    列出权限 = List.of(new SimpleGrantedAuthority(“ROLE_USER”), new SimpleGrantedAuthority(“ROLE_ADMIN”)); // 根据需要更改 UsernamePasswordAuthenticationToken 身份验证 = new UsernamePasswordAuthenticationToken(“用户名”, “Userpwd”, 权限); // 根据需要更改 currentContext.setAuthentication(身份验证); securityContextRepository.saveContext(currentContext, 请求, 响应);

之后一切就都正常了。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.