我想實現沿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認證(自定義的UserDetailsService從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作爲散列的默認值。
我的問題是:
- 是否有一個標準的Spring類,它可以從請求頭,而不是餅乾
- 處理了rememberMe 功能是否有使用更好的散列算法MD5比什麼? (可以很容易地切換而不重寫?)。或者,甚至更好 - 我已經穿過KeyBasedPersistenceTokenService 看起來像 更好的令牌生成服務(SHA512 &附加密鑰信息), 是否有任何使用它創建/驗證安全令牌的良好示例。
我寧願不必擴展所有這些類,因爲一堆核心的東西會是一樣的,而且似乎矯枉過正,不得不擴展它們來改變標記的來源和哈希算法。
非常有幫助我正在考慮採用相同的方法。你有沒有運氣利用類似於KeyBasedPersistenceTokenService的東西來生成令牌? – mjj1409
不,我沒有使用它 - 我只是堅持使用標準的RememberMe token生成器(因爲它被認爲足以在瀏覽器中記住我的功能,所以我決定不投資改變它。 – rhinds