【问题标题】:Spring Security + Vaadin Session No VaadinSessionSpring Security + Vaadin Session 没有 VaadinSession
【发布时间】:2017-09-19 14:56:08
【问题描述】:

我有一个基于一些 github 项目的带有 vaadin 会话的 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 保护?

【问题讨论】:

    标签: java ssl servlets spring-boot vaadin


    【解决方案1】:

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

    编辑

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

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

    @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());
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2019-10-15
    • 2020-08-29
    • 2018-02-23
    • 2016-11-07
    • 2016-07-08
    • 2015-04-13
    相关资源
    最近更新 更多