Spring Security を使用して、ユーザーの最初のログイン時に強制パスワード変更を実装する最もエレガントな方法は何ですか?
ここAuthenticationSuccessHandler
で述べたようにカスタムを実装してみましたが、 rodrigoapで述べたように、ユーザーがアドレス バーに URL を手動で入力すると、ユーザーはパスワードを変更しなくてもそのページに進むことができます。
これは、ForceChangePasswordFilter フィルターで行いました。ユーザーが手動で URL を入力すると、パスワードの変更フォームをバイパスできるためです。フィルターを使用すると、リクエストは常に傍受されます。
そのため、カスタム フィルターの実装を進めました。
私の質問はこれです。カスタムフィルターを実装してその中にリダイレクトを送信すると、フィルターを再度通過し、ここで述べたように無限のリダイレクトループが発生します。security-context.xml で 2 つの http タグを宣言し、最初のタグにそのpattern
ような属性を持つことで言及されているソリューションを実装しようとしましたが、それでもカスタム フィルターを通過します。
<http pattern="/resources" security="none"/>
<http use-expressions="true" once-per-request="false"
auto-config="true">
<intercept-url pattern="/soapServices/**" access="permitAll" requires-channel="https"/>
...
<custom-filter position="LAST" ref="passwordChangeFilter" />
</http>
...
<beans:bean id="passwordChangeFilter"
class="my.package.ForcePasswordChangeFilter"/>
<beans:bean id="customAuthenticationSuccessHandler"
class="my.package.CustomAuthenticationSuccessHandler" >
</beans:bean>
<beans:bean id="customAuthenticationFailureHandler"
class="my.package.CustomAuthenticationFailureHandler" >
<beans:property name="defaultFailureUrl" value="/login"/>
</beans:bean>
私の現在の実装(動作する)は次のとおりです。
- カスタム認証成功ハンドラー内で、セッション属性を設定しました
isFirstLogin
- ForcePasswordChangeFilter で、セッション
isFirstLogin
が設定され ているかどうかを確認します- そうであれば、強制パスワード変更へのリダイレクトを送信します
- そうでなければ、私は電話します
chain.doFilter()
この実装の問題点は、リソース フォルダーへのアクセスもこのフィルターを通過し、ページが歪んでしまうことです (*.js と *.css が正常に取得されないため)。これが、セキュリティ アプリの context.xml に 2 つのタグを設定しようとした理由<http>
です (これは機能しませんでした)。
そのため、servletPath が「/resources」で始まるか含まれている場合は、手動でリクエストをフィルタリングする必要がありました。私はこのようになりたくありませんでした-リクエストパスを手動でフィルタリングする必要があります-しかし、今のところそれは私が持っているものです.
これを行うよりエレガントな方法は何ですか?