我對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>
你怎麼想,我的登錄過程?開始實現令牌處理方法是否是一種好方法?
當然可以。我知道,我必須使用HTTPS。 但我不確切地知道,什麼樣的彈簧安全過濾器對我有好處。 – zappee 2013-03-16 16:31:43
啊,現在我明白了。我建議使用standarts而不是自己的實現。那麼你爲什麼不使用http basic auth? Spring支持它。 – Ralph 2013-03-16 18:25:10