3

サーバーアプリとクライアントアプリの 2 つの Web アプリケーションを開発しています。どちらも Spring Security を使用しています。私の使用例では、ユーザーがサーバー アプリにログインした後、ユーザーはサーバー アプリ内のリンクからクライアント アプリにアクセスできます。ユーザーがこれらのリンクをクリックしたときに再度ログインする必要がないため (要件の一部)、認証情報をサーバー アプリからクライアント アプリに転送するために、シングル サインオンと同様の戦略を使用することにしました。

クライアント アプリでは、Spring Security を使用RequestHeaderAuthenticationFilterして、サーバー アプリによって設定されたカスタム リクエスト ヘッダーを探しています。

  1. このカスタム ヘッダーが見つかった場合、この要求が信頼できるかどうかをさらに検証する必要がありますか? Spring の Pre-Authentication docでは、 RequestHeaderAuthenticationFilter認証を実行せず、SM_USER属性で指定されたユーザーからのリクエストであると想定します。リクエストが本物であることを確認するにはどうすればよいですか?

  2. http 要求でカスタム ヘッダーを使用して、あるアプリから別のアプリにユーザーを送信するにはどうすればよいですか? ヘッダー情報が失われるため、リクエストのリダイレクトは機能しません。転送されたリクエストはクライアント アプリで構成された Spring Security フィルターを通過しないため、転送は機能しません。したがって、リクエストは「認証」されず、セッションは作成されません。

4

1 に答える 1

5

応答がなかったので、同じ SSO 動作を実現するためにアプローチを少し変更しました。この問題を解決するために、ここで自分の質問に答えています。

を使用する代わりに、HttpRequest からプリンシパルと資格情報を取得するRequestHeaderAuthenticationFilterSpring をサブクラス化しました。次に、UserDetails をロードする前にサーバー アプリで Credentials を検証するAbstractPreAuthenticatedProcessingFilterカスタムを実装しました。preAuthenticatedUserDetailsService

#2 に関しては、最初の事前認証済みログイン リクエストでカスタム ヘッダーを使用しなくなりました。クライアントアプリへの最初の事前認証済み「ログイン」リクエストに、プリンシパル (ユーザー名) と資格情報を URL パラメーターとして追加するだけです。2 つのアプリ間の通信は SSL で保護されているため、安全であると判断しました。

これは、私のセキュリティ設定が現在どのように見えるかです:

<b:bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />
<b:bean id="navigatorPreAuthFilter" class="com.example.NavigatorPreAuthenticatedProcessingFilter">
    <b:property name="authenticationManager" ref="authenticationManager" />
</b:bean>

<http auto-config="false" entry-point-ref="http403EntryPoint">

    <custom-filter position="PRE_AUTH_FILTER" ref="navigatorPreAuthFilter" />
    <session-management session-fixation-protection="newSession" />
    <logout logout-success-url="/logout" delete-cookies="JSESSIONID" />

    <intercept-url pattern="/index.jsp" access="ROLE_QUESTIONNAIRE_ASSIGNEE"/>
</http>

<b:bean id="preAuthenticatedUserDetailsService" class="com.example.NavigatorPreAuthenticatedUserDetailsService" />
<b:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <b:property name="preAuthenticatedUserDetailsService" ref="preAuthenticatedUserDetailsService" />
</b:bean>

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="preauthAuthProvider"/>
</authentication-manager>
于 2012-09-11T19:57:53.157 に答える