menu
書いてる野郎
orebike@gmail.com
よくあるのはセッションにある特定の値が存在するかどうかでログインしているかを判断することが多いので そのように実装してみる
ログイン状態はアプリ全体で共通値なのでそのようなセッションの扱いを Spring Boot ではどのように行うのか?
セッションスコープBean というモノを使うようだ。
これは管理したいクラスを作ってセッションに維持するような設定をしておいて、あとは各 Controller で Autowired で入れてもらえば維持されるという仕組みのようだ。
これは認証用の特別なクラスを用意する。
このように作ってみる。ログイン状態を持っておく。
@Component @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) public class AuthUser { private boolean loginFlg = false; public boolean isLoginFlg() { return loginFlg; } public void setLoginFlg(boolean loginFlg) { this.loginFlg = loginFlg; } }
今 login 画面はフリー状態になっているのでこの Controller に入れてみる。
このようにする。
@Controller @RequestMapping("/login") public class LoginController { @Autowired private AuthUser authUser; @RequestMapping("") @NoAuth public String index() { System.out.println(authUser.isLoginFlg()); return "login/index"; } @RequestMapping("/doLogin") @NoAuth public String doLogin() { return "redirect:/hoge"; } }
そうすると確かに何もしてないのに authUser が使えるようになる。当然ヌルポとかにもならない。
それではログイン状態にしてみる。
今は無条件でログイン状態にする。
@Controller @RequestMapping("/login") public class LoginController { @Autowired private AuthUser authUser; @RequestMapping("") @NoAuth public String index() { System.out.println(authUser.isLoginFlg()); return "login/index"; } @RequestMapping("/doLogin") @NoAuth public String doLogin() { authUser.setLoginFlg(true); // this return "redirect:/hoge"; } }
ガード状態は Interceptor で行われているのでここでログイン状態を読み取る必要がある。
とりあえず Autowired でどうにかならないかやってみる。
public class MyAuthInterceptor implements HandlerInterceptor{ @Autowired private AuthUser authUser; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod h = (HandlerMethod) handler; Method m = h.getMethod(); NoAuth a = AnnotationUtils.findAnnotation(m, NoAuth.class); if(a != null) { return true; } return authUser.isLoginFlg(); } }
どうにかなった。これで AuthLogin が維持されている限りログインと認識できる。
当然 hoge/index にも piyo/index に遷移してもちゃんと表示される。