2016-01-22 98 views
7

我對這些框架(Vaadin:7.6.1,Spring Security:4.0.3)感興趣,我想問問自己如何構建Vaadin應用程序的授權請求。用於Vaadin的Spring Security的Java配置

我擡頭一看,其中是這樣寫的幾個例子:

@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter 
{ 

    [...] 

    @Override 
    protected void configure(HttpSecurity http) throws Exception 
    { 
     http 
      .authorizeRequests() 
       .antMatchers("/login**").permitAll() 
       .antMatchers("/UIDL/**").permitAll() 
       .antMatchers("/HEARTBEAT/**").authenticated() 
       .antMatchers("/VAADIN/**").permitAll() 
       .antMatchers("/resources/**").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin().loginPage("/login").permitAll() 
       .and() 
      .logout().permitAll() 
       .and() 
      .csrf().disable(); 
    } 
} 

因爲我要設計我用的是Thymeleaf engine登錄頁面。所以我使用這個控制器類:

如果我想阻止我的應用程序的每個請求,如果用戶沒有登錄我應該定義
@Controller 
public class LoginController 
{ 
    @RequestMapping("/login") 
    String login(Model model) 
    { 
     return "login"; 
    } 
} 

其中.antMatchers()?我知道我必須爲登錄頁面定義antMatchers(「/ resources/**」)。permitAll()以獲取css和圖像。但是這些模式像「/ UIDL/**」是什麼,我需要它們什麼?

回答

4

其中.antMatchers()我應該定義,如果我要攔截的每個請求我的應用程序的 如果用戶沒有登錄?

如果你只是要封鎖的要求,如果用戶沒有登錄:

@Override 
protected void configure(HttpSecurity http) throws Exception 
{ 
    http 
     .authorizeRequests() 
      .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/login").permitAll() 
      .and() 
     .logout().permitAll() 
      .and() 
     .csrf().disable(); 
} 

你真的不需要任何antMatcher,甚至沒有登錄頁面,如.formLogin()部分,您已經爲該頁面包含.permitAll()

現在對於靜態資源(CSS,JS,圖像),並在考慮VAADIN,你可以這樣做覆蓋另一種方法:

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring() 
     .antMatchers("/resources/**", "/VAADIN/**"); 
} 

用彈簧啓動的項目,我也發現了問題,如果我不」允許在web.ignoring().antMatchers(...)中請求"/vaadinServlet/**"

這些模式像「/ UIDL/**」是什麼,我需要什麼?

當服務器收到一個請求時,Spring Security使用這些模式來確定它是允許還是拒絕訪問請求。

它們表示應用程序上下文根之後的URI部分,例如,在您的上下文根是/的情況下,那麼像http://server.com/UIDL/hello URI的部分請求的Spring Security將用來確定閹給ACCES與否將/UIDL/hello

**代表任何東西,包括任何子級,例如對於/UIDL/**模式,請求/UIDL/hello/world/and/any/more/levels將匹配。

還有一個單一的*它表示,但不包括子級別的任何東西,例如,對於/UIDL/*模式,請求/UIDL/hello將匹配,但不匹配/UIDL/hello/world

至於VAADIN意見和用戶界面,我不知道它是可以使用antMatchers授予或拒絕訪問,而是可以用@EnableGlobalMethodSecurity(prePost = enabled)註釋的配置類,然後能夠在使用@PreAuthorize(/* spel expression */)註解授予或拒絕訪問的意見。

UPDATE:回答評論的問題:

  1. 爲什麼你使用configure(WebSecurity網絡)與忽視,而不是配置(HttpSecurity HTTP)與允許訪問的資源的方法?有重大差異嗎?

不同的是,WebSecurity#ignoring()使得從春季安全過濾器鏈被跳過的請求,這是靜態資源,別的不是靜態的資源應該內configure(HttpSecurity http)處理的推薦方式。

source

  • 你爲什麼忽略 「/ VAADIN/**」 的道路?
  • 因爲這條道路是用來服務主題,小工具集和定製,這是靜態的內容,路徑是用來從Vaadin罐子dinamycally服務,但由於Vaadin文檔中建議,在生產環境中應該靜態投放,因爲速度更快。

    source

  • 我能想象的 「/ *」 和 「/ **」 的意思,但什麼是 「UIDL」 和 「心跳」,其實是什麼意思?他們爲什麼被允許?
  • UIDL:

    用戶接口定義語言(UIDL)是 序列化用戶界面的內容和變化的響應從網絡 服務器到瀏覽器的語言。這個想法是,服務器端組件 用畫語言將自己「畫」到屏幕(網頁)。 UIDL消息在瀏覽器中解析並轉換爲GWT小部件。

    source

    心跳請求定期進行,以驗證連接仍然是服務器和客戶端,或會話之間活着沒有過期。

    source - see sections 4.8.5, 4.8.6, 4.8.7 and 4.8.8

    +0

    謝謝您的回覆。 1.爲什麼使用** configure(WebSecurity web)**方法忽略資源而不是** configure(HttpSecurity http)**允許訪問?有重大差異嗎? 2.爲什麼你忽略「/ VAADIN/**」路徑? 3.我可以想象「/ *」和「/ **」的含義,但「UIDL」和「HEARTBEAT」究竟意味着什麼?他們爲什麼被允許? – shinchillahh

    相關問題