私は Spring にあまり詳しくありませんが、いくつかの記事やハウツーを読みました。
必要な業務は次のとおりです。
- 典型的なクライアント/サーバー アーキテクチャ: サーバー側のモバイル クライアントと RESTful サービス
- クライアントは、モバイル アプリケーションにログインするためのさまざまな選択肢を持っています: アプリケーション ログインと 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 サービスの結果は、ユーザーによって異なります。もちろん、それは絶対に正常です。
これらの Web サービスを無許可のユーザーから保護する必要があるため、新しいものを開発する必要があります。
私の考えは:
(*) 次のような 2 つの新しい Web サービスを作成します。
applicationLogin(String username, String password)[/INDENT] と facebookLogin(String accessToken)
http://...../api/login/{username}, {password}
http://...../api/login/{facebook access token}
(*) 権限のないユーザーから Web サービスを保護する必要があります
ユーザー ロギング プロセスは次のようになります。
(1) ユーザーがモバイル デバイスのユーザー名とパスワードのフィールドに入力する (2) アプリケーションのログイン ボタンをクリックする (3) モバイル アプリケーションがhttp://...../api/login/{username}, {password}
パブリック サービスへのサーバー呼び出しを行う ( 4) ユーザー名とパスワードが正しい場合、トークン (有効期限情報を含む長い文字列) を生成し、ユーザー名とトークン文字列を HTTP ヘッダー (5) の応答に入れます。その後、すべてのクライアントが返送する必要があります。これら 2 つのパラメーター (ユーザー名とトークン) は、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>
私のログインプロセスについてどう思いますか? トークン処理メソッドの実装を開始するのは良い方法ですか?