これは奇妙な問題ですが、100% の確率で再現できます。
Grails Spring Security で自動的にログインすると、ユーザーをプログラムでログインするための推奨される方法はspringSecurityService.reauthenticate (username) を使用することであり、これは登録確認後に Spring-Security-UI プラグインで使用されます。
しかし、私のアプリケーションにはこの非常に奇妙な動作があり、すぐには有効にならないように見えます (認証されたページにすぐにリダイレクトしようとします)。ただし、そのブラウザーからドメインで以前のログイン試行が行われていない場合に限ります。この動作は、コードと、このメソッドを使用してユーザーをログインさせると思われる spring-security-ui の「登録の確認」の両方で見られることに注意してください。
明確にするために、私が次の場合:
- my.domain.com の JSESSIONID Cookie をクリアします (私の grails アプリはここで実行されますが、localhost でも再現できます)
- コントローラをヒットしてユーザー ID を入力すると、送信時にユーザーが自動的にログインし、ログインが必要なページにリダイレクトされます。
- 私はそのページにたどり着くのではなく、ログイン画面に移動しました(認証なしでそのページにアクセスしようとすると発生します)。URL の jsessionid に注意してください (もちろん毎回変更されます)。ここには入れません。https://my.domain.com/login/auth;jsessionid=B1C9A849E222476A9C9987923D439D13
- 認証済みのページに手動で移動しようとしても失敗するため、ログインが有効になる前にリダイレクトするという競合状態ではないようです。ログインしていないだけです。
注ステップ 2 でコントローラーを押すか、または他のコントローラーを押すと、実際にはすぐに JSESSIONID が返されますが、最終的に URL に表示される値とは異なります。
ただし、次の場合:
- 以前のログイン試行からの JSESSIONID Cookie があることを確認してください。成功したかどうかは関係ありません。ログアウトしていることを確認します。
- 上記の手順 2 を繰り返します (最初に試行したユーザーではなく、任意のユーザーに対して)。
- すべてが期待どおりに機能します!ログインに成功し、認証が必要なページに移動しました。また、その Cookie を再度クリアするまで、今後の試行に対して引き続き機能します。
私はかなり困惑しています。どういうわけか、競合する JSESSIONID 値を取得しています。springSecurityService.reauthenticate(username) を呼び出した後、redirect(...securepage...) を呼び出す前に何か他のことをする必要がありますか? 私はチャネルセキュリティを使用していることに注意してください.
ユーザー名とパスワードを使用したログイン画面からの通常のログインは、最初はクリーン Cookie で機能することに注意してください。