Otentikasi Dasar Keamanan Musim Semi

1. Ikhtisar

Tutorial ini menunjukkan cara mengatur, mengkonfigurasi dan menyesuaikan Otentikasi Dasar dengan Spring . Kita akan membuat di atas contoh Spring MVC sederhana, dan mengamankan UI aplikasi MVC dengan mekanisme Basic Auth yang disediakan oleh Spring Security.

2. Konfigurasi Keamanan Pegas

Kami dapat mengkonfigurasi Keamanan Musim Semi menggunakan konfigurasi Java:

@Configuration @EnableWebSecurity public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Autowired private MyBasicAuthenticationEntryPoint authenticationEntryPoint; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")) .authorities("ROLE_USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/securityNone").permitAll() .anyRequest().authenticated() .and() .httpBasic() .authenticationEntryPoint(authenticationEntryPoint); http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

Di sini kita menggunakan elemen httpBasic () untuk mendefinisikan Otentikasi Dasar, di dalam metode configure () dari kelas yang memperluas WebSecurityConfigurerAdapter.

Hal yang sama dapat dicapai dengan menggunakan XML juga:

Yang relevan di sini adalah elemen di dalam utama elemen konfigurasi - ini cukup untuk mengaktifkan Otentikasi Dasar untuk seluruh aplikasi. Manajer Otentikasi bukan fokus dari tutorial ini, jadi kami menggunakan manajer dalam memori dengan pengguna dan kata sandi yang ditentukan dalam teks biasa.

The web.xml dari aplikasi web yang memungkinkan Spring Security telah dibahas pada musim semi Keluar tutorial.

3. Mengkonsumsi Aplikasi yang Diamankan

The ikal perintah untuk masuk ke alat untuk mengkonsumsi aplikasi dijamin.

Pertama, mari kita coba meminta /homepage.html tanpa memberikan kredensial keamanan apa pun:

curl -i //localhost:8080/spring-security-rest-basic-auth/api/foos/1

Kami mendapatkan kembali 401 Unauthorized and the Authentication Challenge yang diharapkan:

HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly WWW-Authenticate: Basic realm="Spring Security Application" Content-Type: text/html;charset=utf-8 Content-Length: 1061 Date: Wed, 29 May 2013 15:14:08 GMT

Browser akan menafsirkan tantangan ini dan meminta kami memberikan kredensial dengan dialog sederhana, tetapi karena kami menggunakan curl , ini bukan masalahnya.

Sekarang, mari minta sumber daya yang sama - beranda - tetapi berikan kredensial untuk mengaksesnya juga:

curl -i --user user1:user1Pass //localhost:8080/spring-security-rest-basic-auth/api/foos/1

Sekarang, respon dari server adalah 200 OK bersama dengan Cookie :

HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly Content-Type: text/html;charset=ISO-8859-1 Content-Language: en-US Content-Length: 90 Date: Wed, 29 May 2013 15:19:38 GMT

Dari browser, aplikasi dapat digunakan secara normal - satu-satunya perbedaan adalah halaman login tidak lagi menjadi persyaratan yang sulit karena semua browser mendukung Autentikasi Dasar dan menggunakan dialog untuk meminta kredensial pengguna.

4. Konfigurasi Lebih Lanjut - Titik Masuk

Secara default, BasicAuthenticationEntryPoint yang disediakan oleh Spring Security mengembalikan satu halaman penuh untuk respons 401 Tidak Sah kembali ke klien. Representasi HTML dari kesalahan ini dirender dengan baik di browser, tetapi tidak cocok untuk skenario lain, seperti REST API di mana representasi json mungkin lebih disukai.

Namespace juga cukup fleksibel untuk persyaratan baru ini - untuk mengatasinya - titik masuk dapat diganti:

Titik masuk baru didefinisikan sebagai kacang standar:

@Component public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint { @Override public void commence( HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx) throws IOException, ServletException { response.addHeader("WWW-Authenticate", "Basic + getRealmName() + """); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); PrintWriter writer = response.getWriter(); writer.println("HTTP Status 401 - " + authEx.getMessage()); } @Override public void afterPropertiesSet() throws Exception { setRealmName("Baeldung"); super.afterPropertiesSet(); } }

Dengan menulis langsung ke Respon HTTP kita sekarang memiliki kendali penuh atas format isi respon.

5. Dependensi Maven

Dependensi Maven untuk Keamanan Musim Semi telah dibahas sebelumnya di Keamanan Musim Semi dengan artikel Maven - kita memerlukan spring-security-web dan spring-security-config yang tersedia saat runtime.

6. Kesimpulan

Dalam contoh ini, kami mengamankan aplikasi MVC dengan Spring Security dan Basic Authentication. Kami membahas konfigurasi XML dan menggunakan aplikasi dengan perintah curl sederhana. Terakhir, ambil kendali atas format pesan kesalahan yang tepat - berpindah dari laman kesalahan HTML standar ke format teks khusus atau JSON.

Implementasi lengkap dari tutorial ini dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.

Ketika proyek berjalan secara lokal, contoh HTML dapat diakses di:

// localhost: 8080 / spring-security-rest-basic-auth / api / foos / 1.