Spring Securityは私を覚えている

1概要

このチュートリアルでは、Spring Securityを使用して、WebアプリケーションでRemember Me機能を有効にして設定する方法を説明します。リンクの設定:/spring-security-login[セキュリティと簡単な形式のログインを備えたMVCアプリケーション]についてはすでに説明しました。

メカニズムは 複数のセッションにまたがって ユーザーを識別することができるでしょう - それで理解するべき最初の事はRemember Meがセッションがタイムアウトした後** だけで開始するということです。デフォルトでは、これは30分の非アクティブ状態の後に発生しますが、 web.xml タイムアウトは設定可能 です。

2セキュリティ設定

Javaを使用してセキュリティ設定を設定する方法を見てみましょう。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean("authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user1").password("{noop}user1Pass").roles("USER")
            .and()
            .withUser("admin1").password("{noop}admin1Pass").roles("ADMIN");
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/anonymous** ").anonymous()
            .antMatchers("/login** ").permitAll()
            .anyRequest().authenticated()

            .and()
            .formLogin()
            .loginPage("/login.html")
            .loginProcessingUrl("/login")
            .failureUrl("/login.html?error=true")

            .and()
            .logout().deleteCookies("JSESSIONID")

            .and()
            .rememberMe().key("uniqueAndSecret")
            ;
    }
}

ご覧のとおり、 rememberMe() メソッドを使用した基本的な設定 は非常に単純ですが、追加オプションを使用しても非常に柔軟性があります。ここでは key が重要です。これはアプリケーション全体の秘密の秘密情報であり、トークンの内容を生成するときに使用されます。

さらに、トークンの有効期間は、デフォルトの2週間から、たとえば tokenValiditySeconds() を使用して1日に設定できます。

rememberMe().key("uniqueAndSecret").tokenValiditySeconds(86400)

また、同等のXML構成を見ることもできます。

<http use-expressions="true">
    <intercept-url pattern="/anonymous** " access="isAnonymous()"/>
    <intercept-url pattern="/login** " access="permitAll"/>
    <intercept-url pattern="/** ** " access="isAuthenticated()"/>

    <form-login login-page='/login.html'
      authentication-failure-url="/login.html?error=true"/>
    <logout delete-cookies="JSESSIONID"/>

    <remember-me key="uniqueAndSecret"/>
</http>

<authentication-manager id="authenticationManager">
    <authentication-provider>
        <user-service>
            <user name="user1" password="{noop}user1Pass" authorities="ROLE__USER"/>
            <user name="admin1" password="{noop}admin1Pass" authorities="ROLE__ADMIN"/>
        </user-service>
    </authentication-provider>
</authentication-manager>

3ログインフォーム

ログインフォームは フォームのログインに使用したもの のようになります。

<html>
<head></head>

<body>
    <h1>Login</h1>

    <form name='f' action="login" method='POST'>
        <table>
            <tr>
                <td>User:</td>
                <td><input type='text' name='username' value=''></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='password'/></td>
            </tr>
            <tr>
                <td>Remember Me:</td>
                <td><input type="checkbox" name="remember-me"/></td>
            </tr>
            <tr>
                <td><input name="submit" type="submit" value="submit"/></td>
            </tr>
        </table>
    </form>

</body>
</html>

新しく追加された checkbox input - remember-me へのマッピングに注目してください。この追加の入力は、アクティブな状態でログインしてログインするのに十分です。

このデフォルトパスは次のようにも変更できます。

.rememberMe().rememberMeParameter("remember-me-new")

このメカニズムは、ユーザーがログインしたときに追加のCookie(「remember-me」Cookie)を作成します。

  • Remember Me cookie ** には以下のデータが含まれています。

  • username - ログインしたプリンシパルを識別します

  • expirationTime - クッキーの有効期限が切れます。デフォルトは2週間です

  • MD5ハッシュ - 前の2つの値 - username

expirationTime 、さらに password および事前定義の key

ここで最初に注意することは、 username password の両方がCookieの一部であるということです。つまり、どちらかが変更されると、Cookieは無効になります。また、 username はCookieから読み取ることができます。

さらに、このメカニズムは、「記憶しておく」クッキーが捕捉された場合に脆弱になる可能性があることを理解することが重要です。 ** Cookieは有効期限が切れるか資格情報が変更されるまで有効で使用可能になります。

5実際には

記憶しているメカニズムが機能していることを簡単に確認するには、次のようにします。

  • ログインしてください

  • セッションが期限切れになるのを待ちます(またはで JSESSIONID クッキーを削除します)。

ブラウザ) ** ページを更新

私のことを忘れないでください。クッキーの有効期限が切れると、ユーザーは ログインページにリダイレクトされます 。私を覚えておいて、今すぐユーザーは新しいトークン/クッキーの助けを借りて ログインしたままになります

6. 結論

このチュートリアルでは、セキュリティ設定でRemember Me機能を設定および設定する方法と、どのような種類のデータがCookieに入るのかを簡単に説明しました。

実装はhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-custom[サンプルgithubプロジェクト]にあります - これはEclipseベースのプロジェクトなので、インポートするのは簡単ですそのまま実行します。

プロジェクトがローカルで実行されている場合、 login.html はhttp://localhost:8080/spring-security-mvc-custom/login.html[localhost]でアクセスできます。

前の投稿:Java 9のコンパクト文字列
次の投稿:Javaで二分木を実装する