home wiki.fukuchiharuki.me
Menu

キーワード

  • Spring Boot
  • HandlerInterceptor
  • アスペクト
  • 共通処理

したいこと

ログインユーザーのパスワードが有効期限切れのとき、パスワードリセットページにリダイレクトする。

ただし、UserDetails#isCredentialsNotExpired()は使わない。これを使うとログインした状態でパスワードリセットにリダイレクトさせることができない。ログインさせないためのフラグなので。

どうやって

HandlerInterceptorでアスペクト処理する。

@Component
public class PasswordResetHandlerInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		Authentication authentication = (Authentication) request.getUserPrincipal();
		boolean isPasswordExpired =
		Optional.ofNullable(authentication)
		.map(a -> a.getPrincipal())
		.filter(p -> p instanceof UserDetails)
		.map(p -> (LoggedInUser) p)
		.map(u -> u.isPasswordExpired()) // isCredentialsNotExpired()は無条件にtrue
		.orElse(false);

		if (isPasswordExpired) // リダイレクト処理

		return ! isPasswordExpired;
	}

}

これを登録する。

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

	@Autowired
	PasswordResetHandlerInterceptor passwordResetInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(passwordResetInterceptor);
	}

}

ノート

次に手こずった。

  • HttpServletRequestからログインユーザーを引っこ抜く
  • HandlerInterceptorを登録する

参考