Spring Security を使用して、既存の (非常に「レガシー」な) シングル サインオン ソリューションを使用して新しい Spring MVC アプリケーションを保護しようとしているときに、いくつかの問題が発生しています。
免責事項:私は Spring 全体に比較的精通していますが、Spring Security にはまったく精通していません。私の無知を許してください。
SSO サービスは次のように機能します。
- ユーザーは、選択した Web アプリに移動します: http://apps.myco.com/webapp123
- ユーザーは認証されていないため、http://sso.myco.com/loginにリダイレクトされ、ログインするように求められます。
- ユーザーは認証され、クエリ文字列にトークンが添付されたアプリに戻されます: http://apps.myco.com/webapp123?token=ABCD1234
- 各ページの読み込み (現在は JSP ページ) で、ユーザーのトークンがクエリ文字列から取得され、SOAP コールを介して SSO サービスに返され、トークンの有効性が確認されます。SSO サービスは、トークンの賛成または反対を示します (トークンが有効で最新の場合は賛成、そうでない場合は反対)
- トークンが有効な場合、別の SOAP 呼び出しを行ってユーザー名を取得できます (必要な場合)。
SSO サービスは認証用のユーザー資格情報を処理しないため、アプリケーションごとに処理する必要があります:(
私が理解しているように、ここで一般的に受け入れられている方法は、Spring Security の事前認証フレームワークを使用することですが、(a) その仮定が正しいかどうか、(b) 付属のすべてが必要かどうかはわかりません。その解決策。
現在、LoginUrlAuthenticationEntryPoint
認証されていないユーザーを SSO サイトに誘導する Bean を定義しています。
<beans:bean id="customAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<beans:constructor-arg value="http://sso.myco.com/login" />
</beans:bean>
エントリ ポイントは次のように配線されます。
<http use-expressions="true" entry-point-ref="customAuthenticationEntryPoint">
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/edit/**" access="isAuthenticated()" />
<intercept-url pattern="/setup/**" access="hasRole('setup')" />
<intercept-url pattern="/admin/**" access="hasRole('admin')" />
</http>
私にとっての難点は、SSO サービスから「コールバック」を受信するためにどこに接続するかです。私が望むのは、SSO サービスからこれらのリダイレクトを受け入れ、トークンを検証し、SSO からユーザー名を取得するURL (たとえば、 http://apps.myco.com/webapp123/auth?token=ABCD1234 ) を持つことです。 、次にそのすべての情報を Spring Security コンテキスト内に保存します。ただし、私が間違った道を進んでいる可能性は十分にあります。
どんな助けや指導も大歓迎です。