home wiki.fukuchiharuki.me
Menu

#author("2017-05-31T06:09:58+00:00","default:haruki","haruki")
#author("2017-05-31T06:43:05+00:00","default:haruki","haruki")
* キーワード [#t07885df]
- Spring Boot
- HandlerInterceptor
- アスペクト
- 共通処理

* したいこと [#hef25949]

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

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

* どうやって [#v68925e3]

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

 @Component
 public class PasswordResetHandlerInterceptor extends HandlerInterceptorAdapter {
 
 	@Autowired
 	private LoggedInUserLoadService loggedInUserLoadService;
 
	@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 -> loggedInUserService.loadUserByUsername(u.getUsername())) // DBから取得しないといつまでもパスワード期限切れ
		.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を登録する
- UserDetailsがどうも更新できない
-- ので毎リクエストでDBからユーザーを取得するようにした(何かいい方法ないの??)
-- ので毎リクエストでDBからユーザーを取得するようにした
--- 何かいい方法ないの??
--- パスワードリセットしたらログアウトさせるっていうのがつくりとしてはシンプルなのだけど

* 参考 [#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]]
- [[Spring Boot/特定のログインエラーで画面遷移する]]