Spring Security 3.2.0.RC1 から 3.2.0.RC2 にアップグレードしました。RC1 ですべてが正常に機能しました。RC2 では、カスタム ログイン ページが機能しなくなりました。[ログイン] ボタンをクリックすると、ログイン ページが再表示されます。無効な資格情報が送信された (または資格情報がない) 場合も、エラー メッセージなしで再表示されます。資格情報が正しくない場合、エラー メッセージが正しく表示される前に。
興味深いのは、次のように変更した場合です。
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
// @formatter:off
httpSecurity
.authorizeRequests()
.antMatchers("/restricted/**").hasRole("admin"))
// all requests must be authenticated
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/myLoginUrl.request")
.failureUrl("/myLoginUrl.request?error")
.permitAll()
.and()
.logout()
.permitAll()
.logoutSuccessUrl("/myLoginUrl.request")
;
// @formatter:on
}
に:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
// @formatter:off
httpSecurity
.authorizeRequests()
.antMatchers("/restricted/**").hasRole("admin"))
// all requests must be authenticated
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll()
.logoutSuccessUrl("/myLoginUrl.request")
;
// @formatter:on
}
デフォルトの Spring Security ログイン ページが表示され、機能します。デフォルト ページのソースを調べてカスタム ページと比較したところ、同じ名前のフィールドで同じアクションを呼び出しているようです。
デバッガーをステップ実行すると、AntPathMatcher.java で、パブリック ブール値の一致 (HttpServletRequest リクエスト) が見つかります。
String url = getRequestPath(request)
カスタム ログイン ページを使用すると、返される URL は「/error」です。getRequestPath() は、request.getPathInfo() に追加された request.getServletPath() を返すだけです。RC2 にアップグレードすると「/error」が返される理由がわかりません。