Autenticazione di base Spring Security

1. Panoramica

Questo tutorial mostra come impostare, configurare e personalizzare l' autenticazione di base con Spring . Svilupperemo il semplice esempio Spring MVC e proteggeremo l'interfaccia utente dell'applicazione MVC con il meccanismo di autenticazione di base fornito da Spring Security.

2. La configurazione Spring Security

Possiamo configurare Spring Security usando Java config:

@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(); } }

Qui stiamo usando l' elemento httpBasic () per definire l'autenticazione di base, all'interno del metodo configure () di una classe che estende WebSecurityConfigurerAdapter.

Lo stesso potrebbe essere ottenuto anche utilizzando XML:

Ciò che è rilevante qui è il file elemento all'interno del main elemento della configurazione - questo è sufficiente per abilitare l'autenticazione di base per l'intera applicazione. Il gestore dell'autenticazione non è il fulcro di questo tutorial, quindi utilizziamo un gestore in memoria con l'utente e la password definiti in testo normale.

Il file web.xml dell'applicazione web che abilita Spring Security è già stato discusso nel tutorial Spring Logout.

3. Utilizzo dell'applicazione protetta

Il comando curl è il nostro strumento di riferimento per utilizzare l'applicazione protetta.

Per prima cosa, proviamo a richiedere il /homepage.html senza fornire alcuna credenziale di sicurezza:

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

Riceviamo il previsto 401 Unauthorized e la sfida di autenticazione:

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

Il browser interpreterebbe questa sfida e ci richiederebbe le credenziali con una semplice finestra di dialogo, ma poiché stiamo usando curl , non è questo il caso.

Ora richiediamo la stessa risorsa - la homepage - ma forniamo anche le credenziali per accedervi:

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

Ora, la risposta dal server è 200 OK insieme a un 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

Dal browser, l'applicazione può essere utilizzata normalmente: l'unica differenza è che una pagina di accesso non è più un requisito fondamentale poiché tutti i browser supportano l'autenticazione di base e utilizzano una finestra di dialogo per richiedere all'utente le credenziali.

4. Ulteriore configurazione - il punto di ingresso

Per impostazione predefinita, BasicAuthenticationEntryPoint fornito da Spring Security restituisce una pagina intera per una risposta 401 Non autorizzata al client. Questa rappresentazione HTML dell'errore viene visualizzata correttamente in un browser, ma non è adatta per altri scenari, come un'API REST in cui potrebbe essere preferita una rappresentazione json.

Lo spazio dei nomi è abbastanza flessibile anche per questo nuovo requisito - per risolvere questo problema - il punto di ingresso può essere sovrascritto:

Il nuovo punto di ingresso è definito come un bean 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(); } }

Scrivendo direttamente nella risposta HTTP, ora abbiamo il pieno controllo sul formato del corpo della risposta.

5. Le dipendenze di Maven

Le dipendenze Maven per Spring Security sono state discusse in precedenza nell'articolo Spring Security with Maven: avremo bisogno sia di spring-security-web che di spring-security-config disponibili in fase di esecuzione.

6. Conclusione

In questo esempio, abbiamo protetto un'applicazione MVC con Spring Security e Basic Authentication. Abbiamo discusso la configurazione XML e abbiamo utilizzato l'applicazione con semplici comandi curl. Alla fine ha preso il controllo del formato esatto del messaggio di errore, passando dalla pagina di errore HTML standard a un testo personalizzato o al formato JSON.

L'implementazione completa di questo tutorial può essere trovata nel progetto GitHub: questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.

Quando il progetto viene eseguito in locale, è possibile accedere all'HTML di esempio all'indirizzo:

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