2017-09-19 74 views
0

我有一個基於github項目的vaadin會話,正在開展spring安全項目。所有工作正常,直到我創建一個新的配置靜態類,我想指定SSL應該被要求的路徑。Spring Security + Vaadin Session No VaadinSession

這裏是我的項目和應用程序級的原來的工作狀態: 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(); 
     } 


    } 

該項目編譯和部署wihtout任何錯誤。問題在我啓動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在類VaadinSessionSecurityContextHolderStrategy.java援引方法

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

太早

所以我有什麼做的或者是有一些其他的方式來創建不這個配置類並獲得這個路徑(模式),以保護SSL?

回答

0

您可以跳過使用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()); 
    } 
} 
+0

我之所以使用它,是因爲我需要使用SpringSecurity身份驗證工作VaadinSession。 像這個例子中,我基於它: https://github.com/peholmst/SpringSecurityDemo/tree/master/hybrid-security –