SpringSecurity–さまざまなURLの構成
1. 概要
このチュートリアルでは、さまざまなURLパターンに対してさまざまなセキュリティ構成を使用するようにSpringSecurityを構成する方法を見ていきます。
これは、アプリケーションが特定の操作に対してより高いセキュリティを必要とし、他の操作はすべてのユーザーに許可されている場合に役立ちます。
2. 設定
アプリケーションの設定から始めましょう。
このサービスを作成するには、WebとSecurityの依存関係が必要です。 次の依存関係をに追加することから始めましょう 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のにあります。