EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

Spring Securityでログインした状態を残す

新規プロジェクトで利用しているSpring Boot + Spring Securityですが、ログインした状態を残すためRemember-meという機能を利用しました

Remember-meを有効にする

Remember-meは、HttpSecurityへの設定とログインフォームへの追加で有効になります

HttpSecurityへの設定は、WebSecurityConfigurerAdapterを実装したクラスで行いました

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .... 
        .and()
            .rememberMe()   // ログイン状態を保持する
        ;
}

Thymeleafを利用したログインフォームは、以下のように追加しました

<input class="form-check-input" type="checkbox" name="remember-me" id="remember-me" value="on" checked />

以上で、JSESSIONIDを削除しても、Remember-meによりセッションが維持されます

Remember-meを永続化する

しかしこのままでは、サーバを再起動するとRemember-meが機能しなくなります ユーザーの利便性を考えると、サーバーを再起動するたびにログインが発生することは好ましくありません そこで、Remember-meの情報をデータベースに保存することで、解決してみます

先程の設定に、以下のように設定を追加します

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .... 
        .and()
            .rememberMe()   // ログイン状態を保持する
            .tokenRepository(createTokenRepository())   // Remember-meをデータベースに保存する
        ;
}

public PersistentTokenRepository createTokenRepository() {
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
    tokenRepository.setDataSource(dataSource);
    return tokenRepository;
}

Remember-meの情報を保存するPersistentTokenRepositoryとして、データベースに保存する実装JdbcTokenRepositoryImplを利用するよう設定します 以上で、サーバを再起動しても、Remember-meが機能されるようになります