Konfigurasi Otomatis Keamanan Boot Musim Semi

1. Perkenalan

Pada artikel ini, kita akan melihat pendekatan beropini Spring Boot terhadap keamanan.

Sederhananya, kami akan fokus pada konfigurasi keamanan default dan bagaimana kami dapat menonaktifkan atau menyesuaikannya jika perlu.

2. Pengaturan Keamanan Default

Untuk menambahkan keamanan ke aplikasi Spring Boot kami, kami perlu menambahkan ketergantungan starter keamanan :

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

Ini akan mencakup kelas SecurityAutoConfiguration - yang berisi konfigurasi keamanan awal / default.

Perhatikan bagaimana kami tidak menentukan versi di sini, dengan asumsi bahwa proyek tersebut sudah menggunakan Boot sebagai induknya.

Sederhananya, secara default, Otentikasi diaktifkan untuk Aplikasi. Juga, negosiasi konten digunakan untuk menentukan apakah dasar atau formLogin harus digunakan.

Ada beberapa properti yang telah ditentukan sebelumnya, seperti:

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

Jika kami tidak mengonfigurasi kata sandi menggunakan properti yang telah ditentukan spring.security.user.password dan memulai aplikasi, kami akan melihat bahwa kata sandi default dibuat secara acak dan dicetak di log konsol:

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

Untuk default lainnya, lihat bagian properti keamanan halaman referensi Properti Aplikasi Umum Spring Boot.

3. Menonaktifkan Konfigurasi Otomatis

Untuk membuang konfigurasi otomatis keamanan 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

Ada juga beberapa kasus tertentu di mana penyiapan ini tidak cukup.

Misalnya, hampir setiap aplikasi Spring Boot dimulai dengan Actuator di classpath. Ini menyebabkan masalah karena kelas konfigurasi otomatis lainnya memerlukan kelas yang baru saja kita kecualikan , sehingga aplikasi akan gagal untuk memulai.

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

3.1. Menonaktifkan vs. Melampaui Konfigurasi Otomatis Keamanan

Ada perbedaan yang signifikan antara menonaktifkan konfigurasi otomatis dan melampauinya.

Dengan menonaktifkannya, itu seperti menambahkan ketergantungan Keamanan Musim Semi dan seluruh pengaturan dari awal. Ini dapat berguna dalam beberapa kasus:

  1. Mengintegrasikan keamanan aplikasi dengan penyedia keamanan khusus
  2. Memigrasi aplikasi Spring lama dengan penyiapan keamanan yang sudah ada - ke Spring Boot

Namun, sebagian besar waktu kami tidak perlu sepenuhnya menonaktifkan konfigurasi otomatis keamanan.

Cara Spring Boot dikonfigurasi memungkinkan untuk melampaui keamanan yang dikonfigurasi secara otomatis dengan menambahkan kelas konfigurasi baru / kustom kami. Ini biasanya lebih mudah, karena kami hanya menyesuaikan pengaturan keamanan yang ada untuk memenuhi kebutuhan kami.

4. Mengonfigurasi Keamanan Spring Boot

Jika kita telah memilih jalur untuk menonaktifkan konfigurasi otomatis keamanan, tentu kita perlu menyediakan konfigurasi kita sendiri.

Seperti yang telah kita bahas sebelumnya, ini adalah konfigurasi keamanan default; kita dapat menyesuaikannya dengan memodifikasi file properti.

Misalnya, kita dapat mengganti kata sandi default dengan menambahkan kata sandi kita sendiri:

spring.security.user.password=password

Jika kita menginginkan konfigurasi yang lebih fleksibel, dengan banyak pengguna dan peran misalnya - kita perlu menggunakan kelas @Configuration lengkap :

@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 penjelasan sangat penting jika kita menonaktifkan konfigurasi keamanan default.

Jika hilang, aplikasi akan gagal dimulai. Anotasi ini hanya opsional jika kami hanya mengganti perilaku default menggunakan WebSecurityConfigurerAdapter .

Juga, perhatikan bahwa kita perlu menggunakan PasswordEncoder untuk mengatur kata sandi saat menggunakan Spring Boot 2 . Untuk lebih jelasnya, lihat panduan kami tentang Pengode Kata Sandi Default di Keamanan Musim Semi 5.

Sekarang, kita harus memverifikasi bahwa konfigurasi keamanan kita berlaku dengan benar dengan beberapa tes 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")); } }

Idenya adalah bahwa di balik Spring Boot Security sebenarnya adalah Spring Security, jadi konfigurasi keamanan apa pun yang dapat dilakukan dengan yang ini, atau integrasi apa pun yang didukung ini juga dapat diimplementasikan ke dalam Spring Boot.

5. Konfigurasi Otomatis OAuth2 Boot Musim Semi (menggunakan tumpukan lama)

Spring Boot memiliki dukungan konfigurasi otomatis khusus untuk OAuth2.

Dukungan Spring Security OAuth yang disertakan dengan Spring Boot 1.x telah dihapus di versi boot yang lebih baru sebagai pengganti dukungan OAuth kelas satu yang disertakan dengan Spring Security 5. Kita akan melihat cara menggunakannya di bagian selanjutnya.

Untuk tumpukan lawas (menggunakan Spring Security OAuth), pertama-tama kita perlu menambahkan ketergantungan Maven untuk mulai menyiapkan aplikasi kita:

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

Ketergantungan ini mencakup sekumpulan kelas yang mampu memicu mekanisme konfigurasi otomatis yang ditentukan dalam kelas OAuth2AutoConfiguration .

Sekarang, kami memiliki beberapa pilihan untuk melanjutkan, bergantung pada cakupan aplikasi kami.

5.1. Konfigurasi Otomatis Server Otorisasi OAuth2

Jika kita ingin aplikasi kita menjadi penyedia OAuth2, kita dapat menggunakan @EnableAuthorizationServer .

Saat memulai, kami akan melihat di log bahwa kelas konfigurasi otomatis akan menghasilkan id klien dan rahasia klien untuk server otorisasi kami dan tentu saja kata sandi acak untuk otentikasi dasar.

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 dapat 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 tentang masalah ini.

5.2. Pengaturan Konfigurasi Otomatis OAuth2 Boot Musim Semi lainnya

Ada beberapa kasus penggunaan lain yang dicakup oleh Spring Boot OAuth2 seperti:

  1. Server Sumber Daya - @EnableResourceServer
  2. Aplikasi Klien - @ EnableOAuth2Sso atau @ EnableOAuth2Client

Jika kita membutuhkan aplikasi kita menjadi salah satu jenis di atas, kita hanya perlu menambahkan beberapa konfigurasi ke properti aplikasi, seperti yang dirinci oleh tautan yang dirujuk 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.

Kode sumber untuk OAuth2 dapat ditemukan di repositori GitHub OAuth2 kami, untuk tumpukan lama dan baru. Sisa kode dapat ditemukan di tutorial GitHub.