2013-03-16 97 views
4

我對Spring並不太熟悉,但我已經閱讀了一些文章和操作方法。REST風格的webservice + Spring令牌認證

所需的業務有:

  • 典型的客戶機 - 服務器架構:在服務器端移動客戶端和基於REST的服務
  • 客戶對日誌不同的選擇,進入移動應用:應用程序登錄和Facebook登錄
  • 必須保護服務器端的所有RESTful服務免受未經授權的用戶的侵害

我的責任是開發RESTful服務。我非常擅長應用服務器,Java EE,JMS,JDBC,分佈式事務(XA),但我的安全性不是很好:(

我是用Spring開發的一些STATELESS RESTful web服務。每個人都可以使用它們

例如:

  • http://...../api/country/{**user_id**}
  • http://...../api/country/{**user_id**},{country_id}
  • ...

我的每個web服務都有一個user_id輸入參數,因爲我需要確定哪個用戶發起了服務器調用。 Web服務的結果取決於用戶。當然,這是絕對正常的。

現在,我不得不開發一些新的東西,因爲我必須保護這些webservices免受未經授權的用戶。

我的想法是:

(*)我將創建兩個新的Web服務這樣的:

applicationLogin(字符串用戶名,字符串密碼)[/ INDENT]facebookLogin(字符串的accessToken)

  • http://...../api/login/{username}, {password}
  • http://...../api/login/{facebook access token}

(*)我要保護我的web服務免受未經授權的用戶

用戶登錄過程可能是這樣的: (1)用戶填寫的用戶名和密碼字段(2)點擊應用程序登錄按鈕 (3)移動應用程序撥打http://...../api/login/{username}, {password}公共服務的服務器電話 (4)如果用戶名和密碼正確,我將生成一個令牌(長與expira的字符串並且我將在HTTP頭 (5)的回答中將用戶名和令牌字符串放入它的全部客戶端在進行web服務調用時必須將這兩個參數(用戶名和令牌)發送回服務器之後。

在服務器端,我可以從HTTP請求中讀取用戶名,以便我可以從所有Web服務的簽名中刪除user_id參數。

我想在Spring中實現這個過程。我想我需要使用Spring安全模塊的PRE_AUTH_FILTER。但我不知道我的想法是否好?

我做到了:

網站XML

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/api/country/*</url-pattern> 
</filter-mapping> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext-security.xml, /WEB-INF/applicationContext.xml</param-value> 
</context-param> 

的applicationContext-security.xml文件

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
      xmlns:security="http://www.springframework.org/schema/security" 

     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <security:http use-expressions="true" create-session="stateless" auto-config="false" entry-point-ref="authenticationEntryPoint"> 
     <security:intercept-url pattern="/api/login/*" access="permitAll"/> 
     <security:intercept-url pattern="/api/country/*" access="isAuthenticated()" /> 
     <security:custom-filter position="PRE_AUTH_FILTER" ref="authenticationTokenProcessingFilter" /> 
    </security:http> 

    <bean id="authenticationEntryPoint" class="com.samples.spring.auth.ForbiddenAuthenticationEntryPoint" /> 

    <bean id="userDetailsServiceImpl" class="com.samples.spring.auth.UserDetailsServiceImpl" /> 

    <bean id="preAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 

     <property name="preAuthenticatedUserDetailsService" ref="userDetailsServiceImpl" /> 
    </bean> 

    <bean id="authenticationTokenProcessingFilter" class="com.samples.spring.auth.AuthenticationFilter"> 

     <property name="authenticationManager" ref="appControlAuthenticationManager" /> 
    </bean> 

    <security:authentication-manager alias="appControlAuthenticationManager"> 
     <security:authentication-provider ref="preAuthenticationProvider" /> 
    </security:authentication-manager>  

</beans> 

你怎麼想,我的登錄過程?開始實現令牌處理方法是否是一種好方法?

回答

0

如果您接受一個小改動,您可以使用開箱即用的安全性。

Spring安全使用http會話來存儲用戶詳細信息。而且,https通常由包含會話密鑰或jsessionId參數的會話cookie進行跟蹤。

另一個提示:使用https而不是http。

+0

當然可以。我知道,我必須使用HTTPS。 但我不確切地知道,什麼樣的彈簧安全過濾器對我有好處。 – zappee 2013-03-16 16:31:43

+0

啊,現在我明白了。我建議使用standarts而不是自己的實現。那麼你爲什麼不使用http basic auth? Spring支持它。 – Ralph 2013-03-16 18:25:10

1

除了使用Spring安全性外,Spring還有另一個叫做Spring Social的模塊。我認爲這肯定會對你有所幫助,同時也會減少開發工作。它還允許您使用其他社交網絡(如Twitter,LinkedIn)連接到您的應用程序。還結帳Spring Mobile

+0

但我不確切地知道,什麼樣的彈簧安全過濾器對我有好處。 – zappee 2013-03-16 14:37:27

+0

我查了Spring Social和Spring Mobile。 Spring Mobile:如果你想爲PC用戶和移動用戶構建網頁內容,那就太好了。 春季社交:它使Facebook登錄並重定向到Facebook網頁。 但是,我寫了一些服務器端服務,並沒有任何服務器端的GUI /用戶界面。沒有html或jsp或...頁面,因爲我在寫Web服務。 起初,請忘記臉書問題。我需要實現一個令牌處理auth方法來保護我的web服務免受未經授權的用戶的攻擊。 請告訴我,什麼樣的Spring安全過濾器對我有好處? – zappee 2013-03-16 16:58:06