- 追加された行はこの色です。
- 削除された行はこの色です。
- Spring Boot/パスワードの有効期限切れでリダイレクトする へ行く。
- Spring Boot/パスワードの有効期限切れでリダイレクトする の差分を削除
#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/特定のログインエラーで画面遷移する]]