home wiki.fukuchiharuki.me
Menu
#author("2017-05-23T08:28:07+00:00","default:haruki","haruki")
* キーワード [#t07885df]
- Spring Boot
- HandlerInterceptor
- アスペクト
- 共通処理

* したいこと [#hef25949]

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

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

* どうやって [#v68925e3]

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

* ノート [#a500a29c]

次に手こずった。
- HttpServletRequestからログインユーザーを引っこ抜く
- HandlerInterceptorを登録する

* 参考 [#a9e5a0ab]
- [[java - spring boot adding http request interceptors - Stack Overflow>https://stackoverflow.com/questions/31082981/spring-boot-adding-http-request-interceptors]]
- [[Spring MVC(+Spring Boot)上でのリクエスト共通処理の実装方法を理解する - Qiita>http://qiita.com/kazuki43zoo/items/757b557c05f548c6c5db]]
- [[6.10. 代表的なセキュリティ要件の実装例 — TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.1.0.RELEASE documentation>http://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/Security/SecureLoginDemo.html]]