Spring Bootのセキュリティ自動設定

1前書き

この記事では、Spring Bootのセキュリティに対する考え方のあるアプローチについて説明します。

簡単に言うと、デフォルトのセキュリティ設定と、必要に応じて無効にしたりカスタマイズしたりする方法に焦点を当てます。

2デフォルトのセキュリティ設定

Spring Bootアプリケーションにセキュリティを追加するために、 securityスターター依存関係 を追加する必要があります。

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

これは SecurityAutoConfiguration クラスを含みます - 初期/デフォルトセキュリティ設定を含みます。

プロジェクトがすでにBootを親として使用しているという前提で、ここでバージョンを指定しなかったことに注意してください。

  • 簡単に言うと、デフォルトでは、アプリケーションで基本認証が有効になります。

security.user.name=user
security.basic.enabled=true

アプリケーションを起動すると、デフォルトのパスワードがランダムに生成されてコンソールログに出力されます。

Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6

その他のデフォルトについては、セキュリティプロパティの章のhttps://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html[Spring Boot Common Application Properties]を参照してください。

3自動設定を無効にする

セキュリティの自動設定を破棄して独自の設定を追加するには、 SecurityAutoConfiguration クラスを除外する必要があります。

これは単純な除外によって行うことができます。

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class SpringBootSecurityApplication {

    public static void main(String[]args) {
        SpringApplication.run(SpringBootSecurityApplication.class, args);
    }
}

あるいは application.properties ファイルに設定を追加することによって:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

この設定では十分ではない場合もあります。

たとえば、ほとんどすべてのSpring Bootアプリケーションはクラスパス内のActuatorで起動されます。他の自動設定クラスは先ほど除外したものを必要とするので** これは問題を引き起こします、それでアプリケーションは開始できません。

この問題を解決するために、そのクラスを除外する必要があります。そして、アクチュエータの状況に応じて、 ManagementWebSecurityAutoConfiguration を除外する必要があります。

** 3.1. セキュリティの自動設定を無効にする場合と上回る場合

自動設定を無効にすることとそれを上回ることには大きな違いがあります。

これを無効にすることは、Spring Securityの依存関係と設定全体を最初から追加するのと同じです。これはいくつかのケースで役に立ちます。

  1. アプリケーションセキュリティとカスタムセキュリティプロバイダの統合

  2. 既存のセキュリティーを使用してレガシーSpringアプリケーションを移行する

セットアップ - Spring Bootへ

しかし、ほとんどの場合、セキュリティの自動設定を完全に無効にする必要はありません。

Spring Bootの設定方法は、私たちの新しい/カスタム設定クラスを追加することで自動設定されたセキュリティを超えることを可能にします。ニーズを満たすために既存のセキュリティ設定をカスタマイズしているだけなので、これは通常簡単です。

** 4 Spring Bootのセキュリティ設定

セキュリティの自動設定を無効にする方法を選択した場合は、当然、独自の設定を提供する必要があります。

前述したように、これがデフォルトのセキュリティ設定です。プロパティファイルを変更してカスタマイズできます。

たとえば、次のように独自のパスワードを追加することでデフォルトのパスワードを上書きできます。

security.user.password=password

たとえば、複数のユーザーとロールを使用して、より柔軟な設定が必要な場合は、フル @ Configuration クラスを使用する必要があります。

@Configuration
@EnableWebSecurity
public class BasicConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth
          .inMemoryAuthentication()
          .withUser("user")
            .password("password")
            .roles("USER")
            .and()
          .withUser("admin")
            .password("admin")
            .roles("USER", "ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .anyRequest()
          .authenticated()
          .and()
          .httpBasic();
    }
}

デフォルトのセキュリティ設定を無効にする場合、 @ EnableWebSecurity アノテーションは非常に重要です。

見つからない場合、アプリケーションは起動に失敗します。 WebSecurityConfigurerAdapter を使用してデフォルトの動作をオーバーライドするだけの場合、注釈はオプションにすぎません。

それでは、セキュリティ設定が正しく適用されていることを、いくつかのクイックテストで確認します。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM__PORT)
public class BasicConfigurationIntegrationTest {

    TestRestTemplate restTemplate;
    URL base;
    @LocalServerPort int port;

    @Before
    public void setUp() throws MalformedURLException {
        restTemplate = new TestRestTemplate("user", "password");
        base = new URL("http://localhost:" + port);
    }

    @Test
    public void whenLoggedUserRequestsHomePage__ThenSuccess()
     throws IllegalStateException, IOException {
        ResponseEntity<String> response
          = restTemplate.getForEntity(base.toString(), String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
        assertTrue(response
          .getBody()
          .contains("Baeldung"));
    }

    @Test
    public void whenUserWithWrongCredentials__thenUnauthorizedPage()
      throws Exception {

        restTemplate = new TestRestTemplate("user", "wrongpassword");
        ResponseEntity<String> response
          = restTemplate.getForEntity(base.toString(), String.class);

        assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
        assertTrue(response
          .getBody()
          .contains("Unauthorized"));
    }
}

Spring Boot Securityの背後にあるのは、実際にはSpring Securityなので、これを使って行うことができるセキュリティ設定、またはこれをサポートする統合をSpring Bootに実装することもできます。

5 Spring Boot OAuth2自動設定

Spring BootはOAuth2のための専用の自動設定サポートを持っています。

その前に、Mavenの依存関係を追加してアプリケーションの設定を開始しましょう。

<dependency>
   <groupId>org.springframework.security.oauth</groupId>
   <artifactId>spring-security-oauth2</artifactId>
</dependency>

この依存関係には、 OAuth2AutoConfiguration クラスで定義されている自動設定メカニズムを起動できるクラスのセットが含まれています。

今、私たちは私たちのアプリケーションの範囲に応じて、続けるための複数の選択肢があります。

5.1. OAuth2認証サーバーの自動設定

アプリケーションをOAuth2プロバイダにしたい場合は、 @ EnableAuthorizationServer を使用できます。

起動時に、自動設定クラスが認証サーバー用のクライアントIDとクライアントシークレット、そしてもちろん基本認証用のランダムパスワードを生成することがログに記録されます。

Using default security password: a81cb256-f243-40c0-a585-81ce1b952a98
security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e
security.oauth2.client.client-secret = f1463f8b-0791-46fe-9269-521b86c55b71

これらの資格情報は、アクセストークンを取得するために使用できます。

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e:f1463f8b-0791-46fe-9269-521b86c55b71 \
 -d grant__type=client__credentials -d username=user -d password=a81cb256-f243-40c0-a585-81ce1b952a98 \
 -d scope=write  http://localhost:8080/oauth/token

5.2. その他のSpring Boot OAuth 2自動設定

Spring Boot OAuth2がカバーするユースケースは他にもいくつかあります。

  1. リソースサーバー - @ EnableResourceServer

  2. クライアントアプリケーション - @ EnableOAuth2Sso または @ EnableOAuth2Client

アプリケーションを上記のいずれかのタイプにする必要がある場合は、アプリケーションプロパティに設定を追加するだけです。

OAuth 2固有のプロパティはすべてhttps://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html[Spring Boot Common Application Properties]にあります。

6. 結論

この記事では、Spring Bootが提供するデフォルトのセキュリティ設定に焦点を当てました。セキュリティの自動設定メカニズムを無効にしたり上書きしたりする方法と、新しいセキュリティ設定を適用する方法を説明しました。

ソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-security[over on Github]にあります。