Spring Security - Persistent Remember Me

Spring Security –永続的な記憶

1. 概要

この記事では、Remember Me functionality in Spring Securityを設定する方法を示します–標準のCookieのみのアプローチではなく、a more secure solution, using persistenceを使用します。

簡単な紹介として、Springはブラウザセッション間でログインの詳細を記憶するように設定できます。 これにより、Webサイトにログインし、次にそのサイトにアクセスしたときに(その間にブラウザを閉じた場合でも)自動的にログに記録することができます。

2. 2つの「RememberMe」ソリューション

Springでは、この問題を解決するために、わずかに異なる2つの実装を提供しています。 どちらもUsernamePasswordAuthenticationFilterを使用し、フックを使用してRememberMeServicesの実装を呼び出します。

a previous articleで、Cookieのみを使用する標準のRememberMeソリューションについてはすでに説明しました。 このソリューションでは、remember-meというCookieを使用しました。これには、ユーザー名、有効期限、およびパスワードを含むMD5ハッシュが含まれています。 パスワードのハッシュが含まれているため、Cookieがキャプチャされた場合はthis solution is potentially vulnerableになります。

そのことを念頭に置いて、2番目のアプローチを見てみましょう。PersistentTokenBasedRememberMeServicesを使用して、セッション間で永続化されたログイン情報をデータベーステーブルに格納します。

3. 前提条件–データベーステーブルを作成する

最初に-データベースにログイン情報が必要です-データを保持するためにテーブルを作成する必要があります:

create table if not exists persistent_logins (
  username varchar_ignorecase(100) not null,
  series varchar(64) primary key,
  token varchar(64) not null,
  last_used timestamp not null
);

これは、次のXML構成を介したcreated automatically on startupです(メモリ内のH2データベースを使用)。



    

また、完全を期すために、永続性の設定方法を以下に示します。

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-h2.properties" })
public class DatabaseConfig {

    @Autowired private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));
        return dataSource;
    }
}

[.iframe-fluid] ##

4. Springセキュリティ構成

最初の重要な構成は、Remember-Me Http構成です(dataSourceプロパティに注意してください)。


    ...
    

次に、実際のRememberMeServiceJdbcTokenRepositoryを構成する必要があります(これもdataSource)を使用します。



    
    
    




    
    




    
    

前述したように、標準のTokenBasedRememberMeServicesは、ハッシュされたユーザーパスワードをCookieに保存していました。

このソリューション–PersistentTokenBasedRememberMeServicesunique series identifier for the userを使用します。 これはユーザーの初期ログインを識別し、その永続セッション中にユーザーが自動的にログインするたびに一定のままです。 また、永続化されたremember-me関数を介してユーザーがログインするたびに再生成されるa random tokenも含まれています。

ランダムに生成されたシリーズとトークンのこの組み合わせは永続化され、ブルートフォース攻撃はほとんど起こりません。

6. 実際には

ブラウザで動作するRemember Meメカニズムを確認するには、次のことができます。

  1. ログイン情報を記憶してログインする

  2. ブラウザを閉じます

  3. ブラウザを再度開き、同じページに戻ります。 リフレッシュ。

  4. あなたはまだログインします

Without Remember Me active、Cookieの有効期限が切れた後、ユーザーはログインページにリダイレクトされる必要があります。 With remember meの場合、ユーザーは新しいトークン/ Cookieを使用してログインしたままになります。

ブラウザでCookieを表示したり、データベースに保存されているデータを表示したりすることもできます(このために、埋め込みH2実装から切り替えることができます)。

7. 結論

このチュートリアルでは、set up and configure a database persisted Remember Me Token functionalityを実行する方法を説明しました。 これは、standard Cookie Token based functionalityについて説明した前回の記事のフォローアップでもあります。 データベースのアプローチは、パスワードの詳細がCookieに保持されないため、より安全です。

このSpringSecurity RESTチュートリアルの実装はthe github projectにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。