gpt4 book ai didi

java - Spring Security + Vaadin Session 无 VaadinSession

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:23 25 4
gpt4 key购买 nike

我有一个基于某些 github 项目的带有 vaadin session 的工作 spring 安全项目。一切正常,直到我创建一个新的配置静态类,我想在其中指定需要 SSL 的路径。

这是我的项目和应用程序类的原始工作状态: https://github.com/czetus/dluznikApp/blob/master/src/main/java/com/danes/main/Application.java

将代码添加到 Application.java 到第一个静态类中

public static class SecurityConfiguriation extends GlobalMethodSecurityConfiguration

@EnableWebSecurity
public static class WebSecurity extends WebSecurityConfigurerAdapter{

@Override
protected void configure(HttpSecurity http) throws Exception {
http.requiresChannel()
.antMatchers("/v1*").requiresSecure();
}


}

项目正在编译和部署,没有任何错误。当我启动 localhost:8080 时问题就开始了。我收到此处定义的异常:

https://github.com/czetus/dluznikApp/blob/master/src/main/java/com/danes/main/servlet/VaadinSessionSecurityContextHolderStrategy.java .

java.lang.IllegalStateException: No VaadinSession bound to current thread
at com.danes.main.servlet.VaadinSessionSecurityContextHolderStrategy.getSession(VaadinSessionSecurityContextHolderStrategy.java:41) ~[classes/:na]
at com.danes.main.servlet.VaadinSessionSecurityContextHolderStrategy.clearContext(VaadinSessionSecurityContextHolderStrategy.java:12) ~[classes/:na]
at org.springframework.security.core.context.SecurityContextHolder.clearContext(SecurityContextHolder.java:73) ~[spring-security-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:180) ~[spring-security-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
...

如果我删除注解@EnableWebSecurity,则不会出现错误,并且 ssl 无法正常工作。

当我在调试时,我注意到 getSession 在方法中调用得太早了

@Override
public void setContext(SecurityContext context) {
getSession().setAttribute(SecurityContext.class, context);
}

在 VaadinSessionSecurityContextHolderStrategy.java 类中

那么我必须做什么,或者是否有其他方法可以不创建此配置类并让此路径(模式)受 SSL 保护?

最佳答案

你能跳过使用 VaadinSessionSecurityContextHolderStrategy 吗?具有线程本地策略的默认 Spring 安全设置应该可以工作。

编辑

安全上下文通常存储在为请求提供服务的线程中。安全过滤器在 Vaadin servlet 获取请求之前运行,这意味着 session 尚不存在,因此安全过滤器无法使用 Vaadin session 来存储安全上下文。

您可以使用 session 初始化监听器将相关用户数据添加到 Vaadin session 中当它被调用时,过滤器已经将用户信息添加到线程本地安全上下文持有者中。

@Component("vaadinServlet")
@WebServlet(urlPatterns = "/*", name = "MyVaadinServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = MyUi.class, productionMode = false)
public class MyVaadinServlet extends SpringVaadinServlet {
private static final Logger logger = LoggerFactory.getLogger(MyVaadinServlet.class);

@Override
protected void servletInitialized() throws ServletException {
getService().addSessionInitListener(this::onServletInit);
super.servletInitialized();
}

private void onServletInit(SessionInitEvent sessionInitEvent) {
SecurityContext securityContextOwnedByFilter = SecurityContextHolder.getContext();
VaadinSession session = sessionInitEvent.getSession();
User user = (User) securityContextOwnedByFilter.getAuthentication().getPrincipal();
session.setAttribute("user", user);
logger.info("User '{}' stored in session '{}'",
user.getUsername(),
session.getSession().getId());
}
}

关于java - Spring Security + Vaadin Session 无 VaadinSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46303714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com