Springセキュリティ式の紹介

Spring Security Expressionsの概要

1. 前書き

このチュートリアルでは、Spring Security式に焦点を当て、もちろんこれらの式の実際的な例に焦点を当てます。

より複雑な実装(ACLなど)を検討する前に、セキュリティ式をしっかりと把握することが重要です。セキュリティ式は、正しく使用すれば非常に柔軟で強力になる可能性があるためです。

この記事はSpring Security Expressions – hasRole Exampleの拡張です。

2. Mavenの依存関係

Spring Securityを使用するには、pom.xmlファイルに次のセクションを含める必要があります。


    
        org.springframework.security
        spring-security-web
        4.1.1.RELEASE
    

最新バージョンはhereで見つけることができます。

そして簡単な注意–この依存関係はSpringSecurityのみを対象としています。完全なWebアプリケーションの場合はspring-corespring-contextを追加することを忘れないでください。

3. 設定

まず、Java構成を見てみましょう。

WebSecurityConfigurerAdapterを拡張します。これにより、基本クラスが提供する拡張ポイントのいずれかにフックするオプションがあります。

@Configuration
@EnableAutoConfiguration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityWithoutCsrfConfig extends WebSecurityConfigurerAdapter {
    ...
}

もちろん、XML構成も行うことができます。



    

4. Webセキュリティ式

それでは、セキュリティ式を見てみましょう。

  • ハスロール、ハサニロール

  • Hasauthority、Hasanyauthority

  • Permitall、Denyall

  • Isanonymous、Isrememberme、Isauthenticated、Isfullyauthenticated

  • プリンシパル、認証

  • hasPermission

それでは、これらのそれぞれについて詳しく見ていきましょう。

4.1. hasRole, hasAnyRole

これらの式は、アプリケーションの特定のURLまたはメソッドへのアクセス制御または許可を定義する役割を果たします。

例を見てみましょう:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    ...
    .antMatchers("/auth/admin/*").hasRole("ADMIN")
    .antMatchers("/auth/*").hasAnyRole("ADMIN","USER")
    ...
}

この例では、ロールUSERまたはロールADMIN.でログインしているユーザーに制限された/auth/で始まるすべてのリンクへのアクセスを指定します。さらに、/auth/admin/で始まるリンクにアクセスするにはシステムでADMINの役割を持つ必要があります。

以下を記述することにより、XMLファイルで同じ構成を実現できます。


    
    

4.2. hasAuthority, hasAnyAuthority

役割と権限は、Springでも似ています。

主な違いは、役割には特別なセマンティクスがあることです。SpringSecurity4以降、役割に関連する方法によって、 ‘ROLE_‘プレフィックスが自動的に追加されます(まだ存在しない場合)。

したがって、hasAuthority(‘ROLE_ADMIN')hasRole(‘ADMIN')に似ています。これは、 ‘ROLE_‘プレフィックスが自動的に追加されるためです。

ただし、権限を使用することの良い点は、ROLE_プレフィックスをまったく使用する必要がないことです。

特定の権限を持つユーザーを定義する簡単な例を次に示します。

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
      .withUser("user1").password("user1Pass")
      .authorities("USER")
      .and().withUser("admin").password("adminPass")
      .authorities("ADMIN");
}

もちろん、これらの権限式を使用できます。

@Override
protected void configure(final HttpSecurity http) throws Exception {
    ...
    .antMatchers("/auth/admin/*").hasAuthority("ADMIN")
    .antMatchers("/auth/*").hasAnyAuthority("ADMIN", "USER")
    ...
}

ご覧のとおり、ここでは役割についてはまったく触れていません。

最後に-もちろん、XML構成を使用しても同じ機能を実現できます。


    
        
            
            
        
    

And:


    
    

4.3. permitAll, denyAll

これらの2つの注釈も非常に簡単です。 サービスの一部のURLへのアクセスを許可するか、アクセスを拒否する場合があります。

例を見てみましょう:

...
.antMatchers("/*").permitAll()
...

この構成を使用して、「/」で始まるページ(たとえば、ホームページ)へのアクセスをすべてのユーザー(匿名ユーザーとログインユーザーの両方)に許可します。

URLスペース全体へのアクセスを拒否することもできます。

...
.antMatchers("/*").denyAll()
...

繰り返しますが、XML構成でも同じ構成を実行できます。


     
     

4.4. isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated

このサブセクションでは、ユーザーのログインステータスに関連する式に焦点を当てます。 私たちのページにログインしなかったユーザーから始めましょう。 Java configで以下を指定することにより、すべての不正ユーザーがメインページにアクセスできるようにします。

...
.antMatchers("/*").anonymous()
...

XML設定でも同じです:


    

使用するすべての人がログインする必要があるWebサイトを保護する場合は、isAuthenticated()メソッドを使用する必要があります。

...
.antMatchers("/*").authenticated()
...

またはXMLバージョン:


    

さらに、isRememberMe()isFullyAuthenticated()の2つの追加式があります。 Cookieを使用することで、Springはremember-me機能を有効にするため、毎回システムにログインする必要はありません。 more about Remember Me hereを読み取ることができます。

ログイン機能を使用してのみログインしたユーザーにアクセスを許可するには、次のようにします。

...
.antMatchers("/*").rememberMe()
...

またはXMLバージョン:


    

最後に、サービスの一部では、ユーザーが既にログインしている場合でもユーザーの再認証が必要です。 たとえば、ユーザーが設定や支払い情報を変更したい場合。もちろん、システムのより機密性の高い領域で手動認証を要求することをお勧めします。

これを行うために、isFullyAuthenticated()を指定できます。これは、ユーザーが匿名ユーザーでも記憶記憶ユーザーでもない場合にtrueを返します。

...
.antMatchers("/*").fullyAuthenticated()
...

またはXMLバージョン:


    

4.5. principal, authentication

これらの式により、現在許可されている(または匿名の)ユーザーを表すprincipalオブジェクトと、現在のAuthenticationオブジェクトにそれぞれSecurityContextからアクセスできます。

たとえば、principalを使用して、ユーザーの電子メール、アバター、またはログインしたユーザーがアクセスできるその他のデータを読み込むことができます。

また、authenticationは、付与された権限とともに、完全なAuthenticationオブジェクトに関する情報を提供します。

両方については、次の記事でさらに詳しく説明されています:Retrieve User Information in Spring Security

4.6. hasPermission API

この式はdocumentedであり、式システムとSpring SecurityのACLシステムの間を橋渡しすることを目的としており、抽象的なアクセス許可に基づいて、個々のドメインオブジェクトの承認制約を指定できます。

例を見てみましょう。 私たちは、他の著者によって提案されたどの記事を公開すべきかを決定する、主要な編集者との共同執筆記事を許可するサービスを持っています。

このようなサービスの使用を許可するために、アクセス制御メソッドを使用して次のメソッドを作成する場合があります。

@PreAuthorize("hasPermission(#articleId, 'isEditor')")
public void acceptArticle(Article article) {
   …
}

このメソッドを呼び出すことができるのは許可されたユーザーのみであり、ユーザーはサービスでアクセス許可isEditorを持っている必要があります。

また、アプリケーションコンテキストでPermissionEvaluatorを明示的に構成することを忘れないでください。


    



    

ここで、customInterfaceImplementationPermissionEvaluator.を実装するクラスになります

もちろん、Java構成でもこれを行うことができます。

@Override
protected MethodSecurityExpressionHandler expressionHandler() {
    DefaultMethodSecurityExpressionHandler expressionHandler =
      new DefaultMethodSecurityExpressionHandler();
    expressionHandler.setPermissionEvaluator(new CustomInterfaceImplementation());
    return expressionHandler;
}

5. 結論

このチュートリアルは、Spring Security Expressionsの包括的な紹介とガイドです。

ここで説明するすべての例は、利用可能なon the GitHub projectです。