- 履歴一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 障害メモ/Spring Securityのエラーメッセージにシステムエラーが表示される へ行く。
- 1 (2017-05-25 (木) 10:08:24)
- 2 (2017-05-25 (木) 10:10:01)
キーワード†
- Spring Boot
- Spring Security
- エラーメッセージ
現象†
Spring Securityでログインページを作成するとき、エラーメッセージにシステムエラーが表示されてしまう。たとえば、JDBCアクセスできなかったという詳細なエラーメッセージが「ログインIDかパスワードが間違っています。」と表示したい箇所にモロ出しになる。
原因†
ログインプロセス中に生じた例外をSpring Securityが拾ってしまうため。
対策†
エラーページにリダイレクトする†
ExceptionMappingAuthenticationFailureHandlerを作成して次の例外でエラーページにリダイレクトするように設定する。
- org.springframework.security.authentication.InternalAuthenticationServiceException
public class SecurityConfigAuthenticationFailureHandler extends ExceptionMappingAuthenticationFailureHandler { public SecurityConfigAuthenticationFailureHandler() { this.setDefaultFailureUrl("/"); this.setExceptionMappings(getFailureUrlMap()); } private Map<String, String> getFailureUrlMap() { Map<String, String> map = new HashMap<>(); map.put(InternalAuthenticationServiceException.class.getName(), "/error"); return map; } }
ログ出力する†
エラーページにリダイレクトしても例外オブジェクトは届けられない。ExceptionMappingAuthenticationFailureHandlerは単純にリダイレクトをしているだけだから。なので、このハンドラ中でエラーログ出力してあげる必要がある。
@Override public void onAuthenticationFailure( HttpServletRequest request, HttpServletResponse response, AuthenticationException exception ) throws IOException, ServletException { // TODO: ここで、exceptionを利用してエラーログ出力する super.onAuthenticationFailure(request, response, exception); }
備考†
- InternalAuthenticationServiceExceptionは名前どおり、内部的なエラーを包む。
- InternalAuthenticationServiceExceptionに対するメッセージを定義するだけで足りたりする?(試してない)
- それにしてもエラーログ出力はしたいから何か手を打つ必要はある