Spring Securityフォームログイン
1. 前書き
この記事では、Login with Spring Securityに焦点を当てます。 単純なprevious Spring MVC exampleの上に構築します。これは、ログインメカニズムとともにWebアプリケーションをセットアップするために必要な部分だからです。
参考文献:
Spring Securityフォームログイン
Springログインの例-簡単なログインフォーム、基本的なセキュリティXML設定、およびより高度な設定テクニックのセットアップ方法。
2. Mavenの依存関係
Mavenの依存関係をプロジェクトに追加するには、Spring Security with Maven articleを参照してください。 標準のspring-security-webとspring-security-configの両方が必要になります。
3. Spring SecurityJava構成
WebSecurityConfigurerAdapter.を拡張するSpring Security構成クラスを作成することから始めましょう。@EnableWebSecurityを追加することで、SpringSecurityとMVCの統合サポートを利用できます。
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
.and()
.withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/anonymous*").anonymous()
.antMatchers("/login*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html", true)
//.failureUrl("/login.html?error=true")
.failureHandler(authenticationFailureHandler())
.and()
.logout()
.logoutUrl("/perform_logout")
.deleteCookies("JSESSIONID")
.logoutSuccessHandler(logoutSuccessHandler());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
この例では、メモリ内認証を使用し、3人のユーザーを定義しました。
次に、フォームのログイン構成を作成するために使用した要素について説明します。
3.1. authorizeRequests()
ユーザーが認証できるように、/loginへの匿名アクセスを許可しています。 他のすべても保護しています。
antMatchers()要素の順序は重要であることに注意してください–the more specific rules need to come first, followed by the more general ones。
3.2. formLogin()
これには、フォームログインの動作を設定するために使用できるいくつかのメソッドがあります。
-
loginPage() –custom login page
-
loginProcessingUrl() –ユーザー名とパスワードを送信するURL
-
defaultSuccessUrl() –ログインに成功した後のランディングページ
-
failureUrl() –ログインに失敗した後のランディングページ
3.3. 認証マネージャ
認証プロバイダーは、単純なメモリ内実装、具体的にはInMemoryUserDetailsManagerによって支えられています。 これは、完全な永続化メカニズムがまだ必要ない場合のラピッドプロトタイピングに役立ちます。
Starting with Spring 5, we also have to define a password encoder。 この例では、BCryptPasswordEncoder.を使用しました
4. WebアプリケーションにSpring Securityを追加する
上記で定義したSpring Security構成を使用するには、Webアプリケーションにアタッチする必要があります。 この場合、web.xml:は必要ありません
public class AppInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class>[] getRootConfigClasses() {
return new Class[] {SecSecurityConfig.class};
}
}
Spring Bootアプリケーションを使用している場合、この初期化子は必要ないことに注意してください。 Spring Bootでセキュリティ構成がどのようにロードされるかについての詳細は、Spring Boot security auto-configurationに関する記事を参照してください。
5. Spring SecurityXML構成
対応するXML構成も見てみましょう。
プロジェクト全体でJava構成を使用しているため、Java@Configurationクラスを介してXML構成ファイルをインポートする必要があります。
@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
public SecSecurityConfig() {
super();
}
}
そして、Spring Security XML構成–webSecurityConfig.xml:
6. web.xml
Spring 4が導入される前は、web.xmlでSpring Security構成を構成していました。これは、標準のSpring MVCweb.xmlに追加された追加のフィルターのみです。
Spring Secured Application
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
フィルタ–DelegatingFilterProxy –は、Spring管理のBean –FilterChainProxy –に委任するだけで、SpringBeanの完全なライフサイクル管理などの恩恵を受けることができます。
7. ログインフォーム
ログインフォームページは、map views names to URLsへの簡単なメカニズムを使用してSpring MVCに登録され、その間に明示的なコントローラーは必要ありません。
registry.addViewController("/login.html");
もちろん、これはlogin.jspに対応します。
Login
Spring Login formには、次の関連するアーティファクトがあります。
-
login –認証プロセスをトリガーするためにフォームがPOSTされるURL
-
username –ユーザー名
-
password –パスワード
8. Spring Loginの詳細設定
上記のSpringSecurity構成を紹介したときに、ログインメカニズムのいくつかの構成について簡単に説明しました。ここで、詳細を説明します。
Spring Securityのデフォルトのほとんどを上書きする理由の1つは、hide the fact that the application is secured with Spring Securityを使用して、潜在的な攻撃者がアプリケーションについて知っている情報を最小限に抑えることです。
完全に構成されたログイン要素は次のようになります。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html",true)
.failureUrl("/login.html?error=true")
}
または、対応するXML構成:
8.1. ログインページ
次に、loginPage() method:を使用してカスタムログインページを構成する方法を見てみましょう。
http.formLogin()
.loginPage("/login.html")
または、XML構成を介して:
login-page='/login.html'
これを指定しない場合、Spring Securityは/loginURLに非常に基本的なログインフォームを生成します。
8.2. ログイン用のPOST URL
Spring LoginがPOSTして認証プロセスをトリガーするデフォルトのURLは/loginで、これはSpring Security 4の前に/j_spring_security_checkでした。
loginProcessingUrlメソッドを使用して、次のURLを上書きできます。
http.formLogin()
.loginProcessingUrl("/perform_login")
または、XML構成を介して:
login-processing-url="/perform_login"
このデフォルトURLをオーバーライドする正当な理由は、アプリケーションが実際にSpring Securityで保護されているという事実を隠すことです。つまり、情報を外部から利用できないようにすることです。
8.3. 成功のランディングページ
ログインプロセスが成功すると、ユーザーはページにリダイレクトされます。これはデフォルトでWebアプリケーションのルートになります。
これは、defaultSuccessUrl()メソッドを介してオーバーライドできます。
http.formLogin()
.defaultSuccessUrl("/homepage.html")
または、XML構成の場合:
default-target-url="/homepage.html"
always-use-default-targetがtrueに設定されている場合、ユーザーは常にこのページにリダイレクトされます。 その属性がfalseに設定されている場合、ユーザーは認証を求められる前にアクセスしたい前のページにリダイレクトされます。
8.4. 失敗のランディングページ
ログインページと同様に、ログイン失敗ページは、デフォルトで/login?errorでSpringSecurityによって自動生成されます。
これをオーバーライドするには、failureUrl()メソッドを使用できます。
http.formLogin()
.failureUrl("/login.html?error=true")
またはXMLの場合:
authentication-failure-url="/login.html?error=true"
9. 結論
このSpring Login Exampleでは、簡単な認証プロセスを構成しました。SpringSecurityログインフォーム、セキュリティ構成、および利用可能なより高度なカスタマイズについて説明しました。
このSpringLoginチュートリアルの実装は、the GitHub projectにあります。これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。
プロジェクトをローカルで実行すると、サンプルHTMLにアクセスできます。
http://localhost:8080/spring-security-mvc-login/login.html