Konfigurasi Auto Keselamatan Boot Musim Semi

1. Pengenalan

Dalam artikel ini, kita akan melihat pendekatan Spring Boot yang diberi pendapat mengenai keselamatan.

Ringkasnya, kita akan memfokuskan pada konfigurasi keselamatan lalai dan bagaimana kita dapat menonaktifkan atau menyesuaikannya jika perlu.

2. Persediaan Keselamatan Lalai

Untuk menambahkan keselamatan pada aplikasi Spring Boot kami, kami perlu menambahkan kebergantungan starter keselamatan :

 org.springframework.boot spring-boot-starter-security 

Ini akan merangkumi kelas SecurityAutoConfiguration - yang mengandungi konfigurasi keselamatan awal / lalai.

Perhatikan bagaimana kita tidak menentukan versi di sini, dengan anggapan bahawa projek tersebut sudah menggunakan Boot sebagai induk.

Ringkasnya, secara lalai, Pengesahan akan diaktifkan untuk Aplikasi. Juga, perundingan kandungan digunakan untuk menentukan sama ada asas atau formLogin harus digunakan.

Terdapat beberapa sifat yang telah ditentukan, seperti:

spring.security.user.name spring.security.user.password

Sekiranya kita tidak mengkonfigurasi kata laluan menggunakan spring.security.user.password harta tanah yang telah ditentukan dan memulakan aplikasi, kami akan melihat bahawa kata laluan lalai dihasilkan dan dicetak secara rawak dalam log konsol:

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

Untuk lebih banyak lalai, lihat bahagian sifat keselamatan pada halaman rujukan Spring Boot Common Application Properties.

3. Melumpuhkan Konfigurasi Auto

Untuk membuang konfigurasi automatik keselamatan dan menambahkan konfigurasi kita sendiri, kita perlu mengecualikan kelas SecurityAutoConfiguration .

Ini dapat dilakukan melalui pengecualian sederhana:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class }) public class SpringBootSecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSecurityApplication.class, args); } } 

Atau dengan menambahkan beberapa konfigurasi ke dalam file application.properties :

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

Terdapat juga beberapa kes tertentu di mana persediaan ini tidak mencukupi.

Sebagai contoh, hampir setiap aplikasi Spring Boot dimulakan dengan Actuator di classpath. Ini menimbulkan masalah kerana kelas konfigurasi automatik lain memerlukan kelas yang baru saja kami kecualikan , jadi aplikasi akan gagal dimulakan.

Untuk menyelesaikan masalah ini, kita perlu mengecualikan kelas itu; dan, khusus untuk situasi Penggerak, kita perlu mengecualikan ManagementWebSecurityAutoConfiguration .

3.1. Melumpuhkan vs Melebihi Konfigurasi Auto Keselamatan

Terdapat perbezaan yang signifikan antara menonaktifkan konfigurasi automatik dan melaluinya.

Dengan melumpuhkannya, sama seperti menambahkan pergantungan Keselamatan Musim Semi dan keseluruhan persediaan dari awal. Ini boleh berguna dalam beberapa kes:

  1. Mengintegrasikan keselamatan aplikasi dengan penyedia keselamatan tersuai
  2. Memindahkan aplikasi Spring lama dengan persediaan keselamatan yang sudah ada - ke Spring Boot

Tetapi, selalunya kita tidak perlu mematikan sepenuhnya konfigurasi automatik keselamatan.

Cara Spring Boot dikonfigurasi membolehkan melebihi keselamatan yang dikonfigurasi secara automatik dengan menambahkan dalam kelas konfigurasi baru / khusus kami. Ini biasanya lebih mudah, kerana kami hanya menyesuaikan penyediaan keselamatan yang ada untuk memenuhi keperluan kami.

4. Mengkonfigurasi Keselamatan Boot Musim Semi

Sekiranya kita telah memilih jalan untuk mematikan konfigurasi automatik keselamatan, kita semestinya perlu memberikan konfigurasi kita sendiri.

Seperti yang telah kita bincangkan sebelumnya, ini adalah konfigurasi keselamatan lalai; kita dapat menyesuaikannya dengan mengubahsuai fail harta tanah.

Sebagai contoh, kita boleh mengganti kata laluan lalai dengan menambahkan kata laluan sendiri:

spring.security.user.password=password

Sekiranya kita mahukan konfigurasi yang lebih fleksibel, dengan beberapa pengguna dan peranan misalnya - kita perlu memanfaatkan kelas @Konfigurasi penuh :

@Configuration @EnableWebSecurity public class BasicConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); auth .inMemoryAuthentication() .withUser("user") .password(encoder.encode("password")) .roles("USER") .and() .withUser("admin") .password(encoder.encode("admin")) .roles("USER", "ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest() .authenticated() .and() .httpBasic(); } }

The @EnableWebSecurity anotasi adalah penting jika kita melumpuhkan konfigurasi keselamatan lalai.

Sekiranya tiada, aplikasi akan gagal dimulakan. Anotasi hanya pilihan jika kita hanya mengatasi tingkah laku lalai menggunakan WebSecurityConfigurerAdapter .

Juga, perhatikan bahawa kita perlu menggunakan PasswordEncoder untuk menetapkan kata laluan semasa menggunakan Spring Boot 2 . Untuk maklumat lebih lanjut, lihat panduan kami mengenai Deod Password Encoder in Spring Security 5.

Sekarang, kita harus mengesahkan bahawa konfigurasi keselamatan kita berlaku dengan betul dengan beberapa ujian langsung cepat:

@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("//localhost:" + port); } @Test public void whenLoggedUserRequestsHomePage_ThenSuccess() throws IllegalStateException, IOException { ResponseEntity 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 response = restTemplate.getForEntity(base.toString(), String.class); assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode()); assertTrue(response.getBody().contains("Unauthorized")); } }

Ideanya adalah bahawa di sebalik Spring Boot Security sebenarnya, Spring Security, jadi sebarang konfigurasi keselamatan yang dapat dilakukan dengan yang satu ini, atau integrasi apa pun yang disokong ini juga dapat dilaksanakan ke dalam Spring Boot.

5. Spring Boot OAuth2 Auto-Configuration (menggunakan stack lama)

Spring Boot mempunyai sokongan konfigurasi automatik khusus untuk OAuth2.

Sokongan Spring Security OAuth yang disertakan dengan Spring Boot 1.x dikeluarkan dalam versi boot kemudian sebagai ganti sokongan OAuth kelas pertama yang disertakan dengan Spring Security 5. Kami akan melihat cara menggunakannya di bahagian seterusnya.

Untuk timbunan lama (menggunakan Spring Security OAuth), pertama-tama kita perlu menambahkan pergantungan Maven untuk mula menyiapkan aplikasi kita:

 org.springframework.security.oauth spring-security-oauth2 

Ketergantungan ini merangkumi sekumpulan kelas yang mampu memicu mekanisme konfigurasi automatik yang ditentukan dalam kelas OAuth2AutoConfiguration .

Sekarang, kami mempunyai banyak pilihan untuk meneruskan, bergantung pada ruang lingkup aplikasi kami.

5.1. Konfigurasi Auto Pelayan Pengesahan OAuth2

Sekiranya kami mahu aplikasi kami menjadi penyedia OAuth2, kami boleh menggunakan @EnableAuthorizationServer .

Semasa memulakan, kami akan melihat di log bahawa kelas konfigurasi automatik akan menghasilkan id pelanggan dan rahsia pelanggan untuk pelayan kebenaran kami dan tentu saja kata laluan rawak untuk pengesahan asas.

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

Kredensial ini boleh digunakan untuk mendapatkan token akses:

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 //localhost:8080/oauth/token

Artikel kami yang lain memberikan perincian lebih lanjut mengenai perkara ini.

5.2. Tetapan Konfigurasi Auto OAuth2 Spring Boot yang lain

Terdapat beberapa kes penggunaan lain yang dilindungi oleh Spring Boot OAuth2 seperti:

  1. Pelayan Sumber - @EnableResourceServer
  2. Aplikasi Pelanggan - @ EnableOAuth2Sso atau @ EnableOAuth2Client

Sekiranya kita memerlukan aplikasi kita menjadi salah satu jenis di atas, kita hanya perlu menambahkan beberapa konfigurasi ke sifat aplikasi, seperti yang diperincikan oleh pautan yang disebut di atas.

All OAuth2 specific properties can be found at Spring Boot Common Application Properties.

6. Spring Boot OAuth2 Auto-Configuration (using new stack)

To use the new stack, we need to add dependencies based on what we want to configure – an authorization server, a resource server or a client application.

Let's look at them one by one.

6.1. OAuth2 Authorization Server Support

As we saw in the previous section, the Spring Security OAuth stack offered the possibility of setting up an Authorization Server as a Spring Application. But the project has been deprecated and Spring does not support its own authorization server as of now. Instead, it's recommended to use existing well-established providers such as Okta, Keycloak, and Forgerock.

However, Spring Boot does make it easy for us to configure such providers. For an example Keycloak configuration, we can refer to either A Quick Guide to Using Keycloak with Spring Boot or Keycloak Embedded in a Spring Boot Application.

6.2. OAuth2 Resource Server Support

To include support for a resource server, we need to add this dependency:

 org.springframework.boot spring-boot-starter-oauth2-resource-server 

For the latest version information, head over to Maven Central.

Additionally, in our security configuration, we need to include the oauth2ResourceServer() DSL:

@Configuration public class JWTSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http ... .oauth2ResourceServer(oauth2 -> oauth2.jwt()); ... } }

Our OAuth 2.0 Resource Server With Spring Security 5 gives an in-depth view of this topic.

6.3. OAuth2 Client Support

Similar to how we configured a resource server, a client application also needs its own dependencies and DSLs.

Here's the specific dependency for OAuth2 client support:

 org.springframework.boot spring-boot-starter-oauth2-client  

The latest version can be found at Maven Central.

Spring Security 5 also provides first-class login support via its oath2Login() DSL.

For details on SSO support in the new stack, please refer to our Simple Single Sign-On with Spring Security OAuth2.

7. Spring Boot 2 Security vs Spring Boot 1 Security

Compared to Spring Boot 1, Spring Boot 2 has greatly simplified the auto-configuration.

In Spring Boot 2, if we want our own security configuration, we can simply add a custom WebSecurityConfigurerAdapter. This will disable the default auto-configuration and enable our custom security configuration.

Spring Boot 2 uses most of Spring Security’s defaults. Because of this, some of the endpoints that were unsecured by default in Spring Boot 1 are now secured by default.

These endpoints include static resources such as /css/**, /js/**, /images/**, /webjars/**, /**/favicon.ico, and the error endpoint. If we need to allow unauthenticated access to these endpoints, we can explicitly configure that.

To simplify the security-related configuration, Spring Boot 2 has removed the following Spring Boot 1 properties:

security.basic.authorize-mode security.basic.enabled security.basic.path security.basic.realm security.enable-csrf security.headers.cache security.headers.content-security-policy security.headers.content-security-policy-mode security.headers.content-type security.headers.frame security.headers.hsts security.headers.xss security.ignored security.require-ssl security.sessions

8. Conclusion

In this article, we focused on the default security configuration provided by Spring Boot. We saw how the security auto-configuration mechanism can be disabled or overridden and how a new security configuration can be applied.

Kod sumber untuk OAuth2 boleh didapati di repositori OAuth2 GitHub kami, untuk warisan dan timbunan baru. Selebihnya kod boleh didapati di tutorial GitHub.