Spring Boot/認証/スクラッチ/HelloWorld/040_ログイン状態

Spring Boot/認証/スクラッチ/HelloWorld/040_ログイン状態

よくあるのはセッションにある特定の値が存在するかどうかでログインしているかを判断することが多いので そのように実装してみる

Prev

セッションを扱う

ログイン状態はアプリ全体で共通値なのでそのようなセッションの扱いを 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 に遷移してもちゃんと表示される。

Next

java/spring/spring_boot/auth/scratch/helloworld/040_state_login.txt · 最終更新: 2019-06-28 11:02 by ore