Pengesahan Asas Keselamatan Musim Semi

1. Gambaran keseluruhan

Tutorial ini menunjukkan cara mengatur, mengkonfigurasi dan menyesuaikan Pengesahan Asas dengan Spring . Kita akan membina contoh Spring MVC yang ringkas, dan mengamankan UI aplikasi MVC dengan mekanisme Basic Auth yang disediakan oleh Spring Security.

2. Konfigurasi Keselamatan Musim Semi

Kami dapat mengkonfigurasi Spring Security 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 menentukan Pengesahan Asas, di dalam kaedah konfigurasi () kelas yang memperluas WebSecurityConfigurerAdapter.

Perkara yang sama dapat dicapai dengan menggunakan XML:

Apa yang relevan di sini adalah elemen di dalam utama elemen konfigurasi - ini cukup untuk membolehkan Pengesahan Asas untuk keseluruhan aplikasi. Pengesahan Pengesahan bukanlah fokus tutorial ini, jadi kami menggunakan pengurus dalam memori dengan pengguna dan kata laluan yang ditentukan dalam teks biasa.

The web.xml aplikasi web yang membolehkan Spring Keselamatan telah dibincangkan dalam tutorial Spring Logout.

3. Menggunakan Aplikasi Selamat

The curl arahan adalah pergi ke kami alat untuk memakan permohonan bercagar.

Pertama, mari kita cuba meminta /homepage.html tanpa memberikan sebarang kelayakan keselamatan:

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

Kami mendapat 401 Cabaran Tidak Sah dan Pengesahan 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

Penyemak imbas akan mentafsirkan cabaran ini dan meminta kami mendapat bukti kelayakan dengan dialog mudah, tetapi kerana kami menggunakan curl , ini tidak berlaku.

Sekarang, mari kita minta sumber yang sama - beranda - tetapi berikan kelayakan untuk mengaksesnya juga:

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

Sekarang, tindak balas dari pelayan 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 penyemak imbas, aplikasinya dapat dimakan secara normal - satu-satunya perbezaan adalah bahawa halaman masuk bukan lagi syarat yang sukar kerana semua penyemak imbas menyokong Pengesahan Asas dan menggunakan dialog untuk meminta pengguna mendapatkan bukti.

4. Konfigurasi Selanjutnya - Titik Masuk

Secara lalai, BasicAuthenticationEntryPoint yang disediakan oleh Spring Security mengembalikan halaman penuh untuk respons 401 Tidak Sah kembali kepada klien. Perwakilan ralat HTML ini menunjukkan baik dalam penyemak imbas, tetapi tidak sesuai untuk senario lain, seperti REST API di mana perwakilan json mungkin lebih disukai.

Ruang nama cukup fleksibel untuk keperluan baru ini - untuk mengatasi hal ini - pintu masuk boleh diganti:

Titik masuk baru ditakrifkan sebagai kacang standard:

@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 terus ke Respons HTTP, kita kini mempunyai kawalan penuh terhadap format badan respons.

5. Pergantungan Maven

Ketergantungan Maven untuk Spring Security telah dibincangkan sebelumnya dalam artikel Spring Security dengan Maven - kami memerlukan kedua -spring-security-web dan spring-security-config tersedia pada waktu runtime.

6. Kesimpulannya

Dalam contoh ini, kami memperoleh aplikasi MVC dengan Spring Security dan Basic Authentication. Kami membincangkan konfigurasi XML dan kami menggunakan aplikasi tersebut dengan perintah curl sederhana. Akhirnya mengendalikan format mesej ralat yang tepat - beralih dari halaman ralat HTML standard ke teks tersuai atau format JSON.

Pelaksanaan penuh tutorial ini boleh didapati dalam projek GitHub - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.

Apabila projek dijalankan secara tempatan, HTML sampel dapat diakses di:

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