2014-03-04 148 views
6

我想實現沿this guide春季安全與rememberMe和REST的API

基本流線的API是:

  • 移動應用程序嵌入Web視圖用戶登錄(正常的Web應用安全)
  • 在登錄時,Web應用程序返回一個令牌
  • 移動應用程序安全cookie使用該令牌在將來的所有API請求

所以我試圖通過登錄表單來保證我的webapp允許正常的登錄流程(通過Spring Security),然後根據請求標頭中傳遞的令牌驗證對/ api/**的所有請求。

我本來開始通過具有兩個網絡CONFIGS實現這一點 - 一個用於正常的web應用安全:

@Override protected void configure(HttpSecurity http) throws Exception { 
     http 
      .csrf() 
       .disable() 
      .authorizeRequests() 
       .antMatchers("/resources/**").permitAll() 
       .antMatchers("/sign-in").permitAll() 
       .antMatchers("/success").authenticated() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/") 
       .loginProcessingUrl("/loginprocess") 
       .failureUrl("/sign-in?loginFailure=true") 
       .permitAll(); 
    } 

以上只是定義了標準的Spring Security認證(自定義的UserDetailsS​​ervice從DB獲得的UserDetails)和登錄驗證他和成功頁面。

然後另一個(兩個文件只是爲了清楚/便於閱讀)的API認證:

@Override protected void configure(HttpSecurity http) throws Exception { 
    http 
     .antMatcher("/api/**") 
     .csrf() 
      .disable() 
     .authorizeRequests().anyRequest().authenticated().and() 
     .addFilterBefore(authenticationTokenFilter(), BasicAuthenticationFilter.class) 
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
      .exceptionHandling().authenticationEntryPoint(new Http403ForbiddenEntryPoint()); 
} 

上面有一個AUTH預過濾器從請求抓住相關HTTP標頭(令牌等)並將它們添加到安全上下文 - 自定義身份驗證提供程序然後驗證令牌/用戶詳細信息。

所有的好 - 但是,它感覺就像我重新發明了一堆東西。看過Spring Security的RememberMe功能後,看起來他們已經處理了很多事情 - 在登錄時它會返回一個帶有令牌的cookie,然後該令牌可用於未來請求的自動登錄。從the java docs

<bean id="rememberMeFilter" class= 
"org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter"> 
    <property name="rememberMeServices" ref="rememberMeServices"/> 
    <property name="authenticationManager" ref="theAuthenticationManager" /> 
</bean> 

<bean id="rememberMeServices" class= 
"org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices"> 
    <property name="userDetailsService" ref="myUserDetailsService"/> 
    <property name="key" value="springRocks"/> 
</bean> 

<bean id="rememberMeAuthenticationProvider" class= 
"org.springframework.security.authentication.rememberme.RememberMeAuthenticationProvider"> 
    <property name="key" value="springRocks"/> 
</bean> 

唯一的問題是,我想包括在報頭參數,可以不是一個cookie將來的請求令牌。我已經查看了上述類的源代碼,並且TokenBasedRememberMeServices類autoLogin()方法明確檢查了Cookie。該代碼還使用MD5作爲散列的默認值。

我的問題是:

  1. 是否有一個標準的Spring類,它可以從請求頭,而不是餅乾
  2. 處理了rememberMe 功能是否有使用更好的散列算法MD5比什麼? (可以很容易地切換而不重寫?)。或者,甚至更好 - 我已經穿過KeyBasedPersistenceTokenService 看起來像 更好的令牌生成服務(SHA512 &附加密鑰信息), 是否有任何使用它創建/驗證安全令牌的良好示例。

我寧願不必擴展所有這些類,因爲一堆核心的東西會是一樣的,而且似乎矯枉過正,不得不擴展它們來改變標記的來源和哈希算法。

回答

7

好的,看了一下,似乎沒有實現請求頭的RememberMe功能的核心類 - 但是,通過Spring Security閱讀我的源代碼,實際上很容易擴展上述類查看請求頭。

細節都在這裏:http://automateddeveloper.blogspot.co.uk/2014/03/securing-your-mobile-api-spring-security.html但基本上只是使用RememberMe作爲正常的,但然後擴展TokenBasedRememberMeServices並重寫extractCookie方法只是從標頭抓取標記而不是cookie(可能有點hacky,擴展方法所謂extractCookie來抓取請求標題,但它的工作原理)

+0

非常有幫助我正在考慮採用相同的方法。你有沒有運氣利用類似於KeyBasedPersistenceTokenService的東西來生成令牌? – mjj1409

+0

不,我沒有使用它 - 我只是堅持使用標準的RememberMe token生成器(因爲它被認爲足以在瀏覽器中記住我的功能,所以我決定不投資改變它。 – rhinds