7

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」で始まるか含まれている場合は、手動でリクエストをフィルタリングする必要がありました。私はこのようになりたくありませんでした-リクエストパスを手動でフィルタリングする必要があります-しかし、今のところそれは私が持っているものです.

これを行うよりエレガントな方法は何ですか?

4

5 に答える 5

6

そのような機能が組み込みとして春によって提供されるかどうかはわかりません。

ユーザーが初めてログインしたかどうかを識別するのに役立つテーブルに1つの列を設定することで、同様のことを達成しました。

初めてのログインの場合、私の場合に表示するビューはリセットされたパスワードページでした。それ以外の場合はダッシュボードページです。

于 2013-07-25T04:11:58.797 に答える
-2

パスワードの変更は、他のエンティティ フィールドの変更と同様に処理します。

この状況では、架空のユーザー オブジェクトの更新フォームを作成できます。ユーザーエンティティをデータベースに保存するとき、ハッシュ化されたパスワードを保存したり、salt を処理したりする必要がある場合があります。しかし、これは Spring のセキュリティジョブではありません。

于 2015-10-03T13:42:31.827 に答える