私はこの質問が以前に尋ねられたことを知っています、しかし私はここで特定の問題に直面しています。
スプリングセキュリティ3.1.3を使用しています。
Webアプリケーションに3つのログインケースがあります。
- ログインページからログイン:OK。
- 制限されたページからログイン:OKも。
- 制限のないページからログインする:OKではありません...「製品」ページには誰でもアクセスでき、ユーザーはログに記録されていればコメントを投稿できます。したがって、ユーザーが接続できるようにするために、ログインフォームが同じページに含まれています。
ケース3)の問題は、ユーザーを「製品」ページにリダイレクトできないことです。ログインに成功すると、何があってもホームページにリダイレクトされます。
ケース2)の場合、ログインに成功すると、制限されたページへのリダイレクトがすぐに機能することに注意してください。
これが私のsecurity.xmlファイルの関連部分です:
<!-- Authentication policy for the restricted page -->
<http use-expressions="true" auto-config="true" pattern="/restrictedPage/**">
<form-login login-page="/login/restrictedLogin" authentication-failure-handler-ref="authenticationFailureHandler" />
<intercept-url pattern="/**" access="isAuthenticated()" />
</http>
<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
<form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
<logout logout-url="/logout" logout-success-url="/" />
</http>
「すべてのページの認証ポリシー」が問題の原因であると思われます。ただし、削除するとログインできなくなります...j_spring_security_checkは404エラーを送信します。
編集:
ラルフのおかげで、私は解決策を見つけることができました。だからここにあるのは:私はプロパティを使用しました
<property name="useReferer" value="true"/>
ラルフが見せてくれた。その後、私のケースで問題が発生しました1):ログインページを介してログインするとき、ユーザーは同じページにとどまりました(以前のようにホームページにリダイレクトされませんでした)。この段階までのコードは次のとおりです。
<!-- Authentication policy for login page -->
<http use-expressions="true" auto-config="true" pattern="/login/**">
<form-login login-page="/login" authentication-success-handler-ref="authenticationSuccessHandlerWithoutReferer" />
</http>
<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
<form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
<logout logout-url="/logout" logout-success-url="/" authentication-success-handler-ref="authenticationSuccessHandler"/>
</http>
<beans:bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<!-- After login, return to the last visited page -->
<beans:property name="useReferer" value="true" />
</beans:bean>
<beans:bean id="authenticationSuccessHandlerWithoutReferer" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<!-- After login, stay to the same page -->
<beans:property name="useReferer" value="false" />
</beans:bean>
これは、少なくとも理論的には機能するはずですが、そうではありませんでした。私はまだ理由がわからないので、誰かがこれについて答えを持っているなら、私は喜んで彼に彼の解決策を共有することを許可するための新しいトピックを作成します。
その間に、私は回避策にたどり着きました。最善の解決策ではありませんが、私が言ったように、誰かがもっと良いものを見せてくれるなら、私はすべての耳です。したがって、これはログインページの新しい認証ポリシーです。
<http use-expressions="true" auto-config="true" pattern="/login/**" >
<intercept-url pattern="/**" access="isAnonymous()" />
<access-denied-handler error-page="/"/>
</http>
ここでの解決策は非常に明白です。ログインページは匿名ユーザーにのみ許可されます。ユーザーが接続されると、エラーハンドラーはユーザーをホームページにリダイレクトします。
私はいくつかのテストを行いましたが、すべてがうまく機能しているようです。