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")
4クッキー
このメカニズムは、ユーザーがログインしたときに追加の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]でアクセスできます。