Spring SecurityによるJava EEの保護
1. 概要
このクイックチュートリアルでは、secure a Java EE web application with Spring Securityを実行する方法を見ていきます。
2. Mavenの依存関係
このチュートリアルに必要なSpring Security dependenciesから始めましょう:
org.springframework.security
spring-security-web
4.2.3.RELEASE
org.springframework.security
spring-security-config
4.2.3.RELEASE
org.springframework.security
spring-security-taglibs
4.2.3.RELEASE
最新のSpringSecurityバージョン(このチュートリアルの執筆時点)は4.2.3.RELEASEです。いつものように、Maven Centralで最新バージョンを確認できます。
3. セキュリティ構成
次に、既存のJava EEアプリケーションのセキュリティ構成を設定する必要があります。
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password("user1Pass").roles("USER")
.and()
.withUser("admin").password("adminPass").roles("ADMIN");
}
}
configure()メソッドでは、AuthenticationManagerを設定します。 簡単にするために、単純なメモリ内認証を実装します。 ユーザーの詳細はハードコードされています。
これは、完全な永続化メカニズムが不要な場合のラピッドプロトタイピングに使用することを目的としています。
次に、SecurityWebApplicationInitializerクラスを追加して、セキュリティを既存のシステムに統合しましょう。
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(SpringSecurityConfig.class);
}
}
このクラスは、アプリケーションの起動時にSpringSecurityConfigがロードされるようにします。 この段階では、we’ve achieved a basic implementation of Spring Securityです。 この実装では、Spring Securityはデフォルトですべてのリクエストとルートの認証を要求します。
4. セキュリティルールの構成
WebSecurityConfigurerAdapterのconfigure(HttpSecurity http)メソッドをオーバーライドすることで、SpringSecurityをさらにカスタマイズできます。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/auth/login*").anonymous()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/auth/login")
.defaultSuccessUrl("/home", true)
.failureUrl("/auth/login?error=true")
.and()
.logout().logoutSuccessUrl("/auth/login");
}
antMatchers()メソッドを使用して、/auth/loginへの匿名アクセスを許可し、他の要求を__認証するようにSpringSecurityを構成します。
4.1. カスタムログインページ
カスタムログインページは、formLogin()メソッドを使用して構成されます。
http.formLogin()
.loginPage("/auth/login")
これが指定されていない場合、Spring Securityは/loginにデフォルトのログインページを生成します。
Login
4.2. カスタムランディングページ
ログインが成功すると、Spring Securityはユーザーをアプリケーションのルートにリダイレクトします。 デフォルトの成功URLを指定することでこれをオーバーライドできます:
http.formLogin()
.defaultSuccessUrl("/home", true)
defaultSuccessUrl()メソッドのalwaysUseパラメータをtrueに設定すると、ユーザーは常に指定されたページにリダイレクトされます。
alwaysUseパラメータが設定されていないかfalseに設定されている場合、ユーザーは認証を求められる前に、アクセスしようとした前のページにリダイレクトされます。
同様に、カスタムエラーランディングページも指定できます。
http.formLogin()
.failureUrl("/auth/login?error=true")
4.3. 承認
ロールへのリソースへのアクセスを制限できます。
http.formLogin()
.antMatchers("/home/admin*").hasRole("ADMIN")
管理者以外のユーザーが/home/adminエンドポイントにアクセスしようとすると、アクセス拒否エラーが発生します。
ユーザーの役割に基づいて、JSPページのデータを制限することもできます。 これは、<security:authorize>タグを使用して行われます。
このタグを使用するには、ページの上部にSpring Securityタグtaglibを含める必要があります。
<%@ taglib prefix="security"
uri="http://www.springframework.org/security/tags" %>
5. Spring SecurityのXML構成
これまで、JavaでのSpring Securityの構成について見てきました。 同等のXML構成を見てみましょう。
まず、XML構成を含むweb/WEB-INF/springフォルダーにsecurity.xmlファイルを作成する必要があります。 このようなsecurity.xml構成ファイルの例は、記事の最後にあります。
まず、認証マネージャーと認証プロバイダーを構成します。 簡単にするために、単純なハードコーディングされたユーザー資格情報を使用します。
今やったことは、ユーザー名、パスワード、ロールを持つユーザーを作成することです。
または、パスワードエンコーダーを使用して認証プロバイダーを構成できます。
SpringのUserDetailsServiceまたはDatasourceのカスタム実装を認証プロバイダーとして指定することもできます。 詳細については、here.をご覧ください。
認証マネージャーを構成したので、セキュリティルールを設定し、アクセス制御を適用しましょう。
上記のスニペットでは、フォームログインを使用するようにHttpSecurityを構成し、ログイン成功URLとして/secure.jspを設定しています。 /index.jspおよび“/”パスへの匿名アクセスを許可しました。 また、/secure.jspへのアクセスには認証が必要であり、認証されたユーザーは少なくともROLE_USERレベルの権限を持っている必要があることを指定しました。
httpタグのauto-config属性をtrueに設定すると、Spring Securityは、構成でオーバーライドする必要のないデフォルトの動作を実装するように指示されます。 したがって、/loginと/logoutは、それぞれユーザーのログインとログアウトに使用されます。 デフォルトのログインページも提供されます。
カスタムのログインページとログアウトページ、認証の失敗と成功の両方を処理するURLを使用して、form-loginタグをさらにカスタマイズできます。 Security Namespace appendixは、form-login(およびその他の)タグのすべての可能な属性をリストします。 一部のIDEでは、ctrlキーを押しながらタグをクリックすることで検査を行うこともできます。
最後に、アプリケーションの起動時にsecurity.xml構成をロードするには、次の定義をweb.xmlに追加する必要があります。
contextConfigLocation
/WEB-INF/spring/*.xml
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
org.springframework.web.context.ContextLoaderListener
同じJEEアプリケーションでXMLベースの構成とJavaベースの構成の両方を使用しようとすると、エラーが発生する可能性があることに注意してください。
6. 結論
この記事では、Spring Securityを使用してJava EEアプリケーションを保護する方法を説明し、Javaベースの構成とXMLベースの構成の両方を示しました。
また、ユーザーの役割に基づいて特定のリソースへのアクセスを許可または取り消す方法についても説明しました。
完全なソースコードとXML定義はover on GitHubで入手できます。