Spring Security - Persistent Remember Me

1概要

この記事では、Spring Securityで Remember Me機能を設定する方法を説明します。標準のCookieのみのアプローチではなく、 永続性を使用した** より安全なソリューションです。

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

2 2つの「Remember Me」ソリューション

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

/spring-security-remember-me[前回の記事]で、Cookieのみを使用した標準のRemember Meソリューションについては既に説明しました。このソリューションでは、ユーザー名、有効期限、パスワードを含むMD5ハッシュを含む remember-me というCookieを使用しました。パスワードのハッシュが含まれているため、このソリューションはCookieがキャプチャされた場合に潜在的に脆弱です。

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

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構成を介して(インメモリーH2 dbを使用して)生成されます。

<!-- create H2 embedded database table on startup -->
<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:/persisted__logins__create__table.sql"/>
</jdbc:embedded-database>

そして完全を期すために、永続性を設定する方法は次のとおりです。

@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;
    }
}

4 Springのセキュリティ設定

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

<http use-expressions="true">
    ...
    <remember-me data-source-ref="dataSource" token-validity-seconds="86400"/>
<http">

次に、実際の RememberMeService JdbcTokenRepository (これも dataSourceを使用します) を設定する必要があります。

<!-- Persistent Remember Me Service -->
<beans:bean id="rememberMeAuthenticationProvider" class=
  "org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices">
    <beans:constructor-arg value="myAppKey"/>
    <beans:constructor-arg ref="jdbcTokenRepository"/>
    <beans:constructor-arg ref="myUserDetailsService"/>
</beans:bean>

<!-- Uses a database table to maintain a set of persistent login data -->
<beans:bean id="jdbcTokenRepository"
  class="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl">
    <beans:property name="createTableOnStartup" value="false"/>
    <beans:property name="dataSource" ref="dataSource"/>
</beans:bean>

<!-- Authentication Manager (uses same UserDetailsService as RememberMeService)-->
<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="myUserDetailsService"/>
    </authentication-provider>
</authentication-manager>

前述のとおり、標準の TokenBasedRememberMeServices はハッシュ化されたユーザーパスワードをCookieに格納していました。

この解決策 - PersistentTokenBasedRememberMeServices はユーザー に対して 一意のシリーズ識別子を使用します。これは、ユーザの初期ログインを識別し、その永続セッション中にユーザが自動的にログインするたびに一定に保たれます。ユーザーが永続的なremember-me機能を介してログインするたびに再生成される ランダムトークン も含まれます。

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

6. 実際には

ブラウザで機能する「記憶している」メカニズムを確認するには、次のようにします。

  1. Remember Meをアクティブにしてログイン

  2. ブラウザを閉じる

  3. ブラウザを再起動して同じページに戻ります. 更新します.

  4. あなたはまだログインしているでしょう

    • Remember Meを有効にしないで 、クッキーの有効期限が切れると、ユーザーはログインページにリダイレクトされます。 覚えておいて** 、ユーザーは新しいトークン/クッキーを使ってログインしたままになります。

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

7. 結論

このチュートリアルでは、** データベースの永続的なRemember Me Token機能を設定および設定する方法を説明しました。それはまたリンクを論議した前の記事へのフォローアップです:/spring-security-remember-me[標準的なクッキートークンベースの機能]。パスワードの詳細はCookieに保持されないため、データベースのアプローチはより安全です。ただし、設定が少し増えます。

このSpring Security RESTチュートリアルの実装はhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-persisted-remember-me#readme[the github project]にあります。 Eclipseベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。

前の投稿:Tomcatルートにアプリケーションをデプロイする
次の投稿:Spring Securityの2つのログインページ