キーワード

現象

Spring Securityでログインページを作成するとき、エラーメッセージにシステムエラーが表示されてしまう。たとえば、JDBCアクセスできなかったという詳細なエラーメッセージが「ログインIDかパスワードが間違っています。」と表示したい箇所にモロ出しになる。

原因

ログインプロセス中に生じた例外をSpring Securityが拾ってしまうため。

対策

エラーページにリダイレクトする

ExceptionMappingAuthenticationFailureHandlerを作成して次の例外でエラーページにリダイレクトするように設定する。

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);
	}

備考

参考

Last-modified: 2017-06-07 (水) 11:29:52 (837d)