1. 概要

このチュートリアルでは、さまざまなURLパターンに対してさまざまなセキュリティ構成を使用するようにSpringSecurityを構成する方法を見ていきます。

これは、アプリケーションが特定の操作に対してより高いセキュリティを必要とし、他の操作はすべてのユーザーに許可されている場合に役立ちます。

2. 設定

アプリケーションの設定から始めましょう。

このサービスを作成するには、WebSecurityの依存関係が必要です。 次の依存関係をに追加することから始めましょう pom.xml ファイル:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-security</artifactId> 
</dependency> 

3. APIを作成します

ProductAPIとCustomerAPIの2つのAPIを使用してRESTfulWebサービスを作成します。 これを実現するために、2つのコントローラーをセットアップします。

3.1. 製品API

ProductControllerを作成しましょう。 これには、製品のリストを返す単一のメソッドgetProductsが含まれています。

@RestController("/products")
public class ProductController {
    
    @GetMapping
    public List<Product> getProducts() {
        return new ArrayList<>(Arrays.asList(
          new Product("Product 1", "Description 1", 1.0),
          new Product("Product 2", "Description 2", 2.0)
        ));
    }
}

3.2. カスタマーAPI

同様に、 CustomerControllerを定義しましょう:

@RestController("/customers")
public class CustomerController {
    
    @GetMapping("/{id}")
    public Customer getCustomerById(@PathVariable("id") String id) {
        return new Customer("Customer 1", "Address 1", "Phone 1");
    }
}

一般的なWebアプリケーションでは、ゲストユーザーを含むすべてのユーザーが製品のリストを取得できます。

ただし、IDで顧客の詳細を取得することは、管理者だけができることのように思えます。 したがって、これを可能にする方法でセキュリティ構成を定義します。

4. セキュリティ構成を設定する

プロジェクトにSpringSecurityを追加すると、デフォルトですべてのAPIへのアクセスが無効になります。 そのため、APIへのアクセスを許可するようにSpringSecurityを構成する必要があります。

これを行うには、WebSecurityConfigurerAdapterクラスを拡張するSecurityConfigurationクラスを作成します。

SecurityConfigurationクラスを作成しましょう。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .antMatchers("/products/**").permitAll()
          .and()
          .authorizeRequests()
          .antMatchers("/customers/**").hasRole("ADMIN")
          .anyRequest().authenticated()
          .and()
          .httpBasic();
    }
}

ここでは、 configure(HttpSecurity)メソッドをオーバーライドして、アプリケーションのセキュリティを構成しました。

さらに、基本認証の準備をするには、アプリケーションのユーザーを構成する必要があります。

コードの各部分を読んで、理解を深めます。

4.1. ProductsAPIへのリクエストの許可

  • authorizeRequests():このメソッドは、リクエストを承認するときに次のルールを使用するようにSpringに指示します。
  • antMatchers(“ / products / **”):これは、セキュリティ構成が適用されるURLパターンを指定します。 permitAll()アクションでチェーンしています。 リクエストのパスに「/products」が含まれている場合、そのリクエストはコントローラーに送信できます。
  • and()メソッドを使用して、構成にルールを追加できます。

これは、ルールの1つのチェーンの終わりを示します。 以下の他のルールもリクエストに適用されます。 したがって、ルールが互いに競合しないようにする必要があります。 上部に一般的なルールを定義し、下部に具体的なルールを定義することをお勧めします。

4.2. カスタマーAPIへの管理者アクセスのみを許可する

次に、構成の2番目の部分を見てみましょう。

  • 新しいルールを開始するには、 authorizeRequests()メソッドをもう一度使用できます。
  • antMatchers( “/ Customers / **”)。hasRole( “ADMIN”):URLのパスに「/ Customers」が含まれている場合、ユーザーがリクエストを行っていることを確認しますADMINの役割があります。

ユーザーが認証されていない場合、「401Unauthorized」エラーが発生します。 ユーザーが正しい役割を持っていない場合、これは「403Forbidden」エラーにつながります。

4.3. デフォルトのルール

特定のリクエストに一致する一致を追加しました。 次に、残りのリクエストのデフォルトの動作を定義する必要があります。

anyRequest()。authenticated() anyRequest()は、以前のルールと一致しなかったリクエストのルールチェーンを定義します。 私たちの場合、そのような要求は、それらが認証されている限り渡されます。

構成にはデフォルトのルールが1つしか存在できず、最後にある必要があることに注意してください。 デフォルトのルールを追加した後にルールを追加しようとすると、エラーが発生します–「anyRequestの後にantMatchersを構成できません」。

5. テスト

cURLを使用して両方のAPIをテストしてみましょう。

5.1. 製品APIをテストする

$ curl -i http://localhost:8080/products
[
  {
    "name": "Product 1",
    "description": "Description 1",
    "price": 1.0
  },
  {
    "name": "Product 2",
    "description": "Description 2",
    "price": 2.0
  }
]

期待通りに2つの商品をお届けします。

5.2. カスタマーAPIをテストする

$ curl -i http://localhost:8080/customers/1

応答本文は空です。

ヘッダーを確認すると、「401Unauthorized」ステータスが表示されます。 これは、Customer APIへのアクセスが、ロールADMINを持つ認証済みユーザーにのみ許可されているためです。

リクエストに認証情報を追加した後、もう一度試してみましょう。

$ curl -u admin:password -i http://localhost:8080/customers/1 
{
  "name": "Customer 1",
  "address": "Address 1",
  "phone": "Phone 1"
}

すごい! これで、CustomerAPIにアクセスできます。

6. 結論

このチュートリアルでは、SpringBootアプリケーションでSpringSecurityを設定する方法を学びました。 また、 antMatchers()メソッドを使用したURLパターンに固有のアクセスの構成についても説明しました。

いつものように、このチュートリアルのコードはGitHubにあります。