Introducere în Java Config pentru Spring Security

1. Prezentare generală

Acest articol este o introducere în configurația Java pentru Spring Security care permite utilizatorilor să configureze cu ușurință Spring Security fără utilizarea XML .

Configurarea Java a fost adăugată cadrului Spring în Spring 3.1 și extinsă la Spring Security în Spring 3.2 și este definită într-o clasă adnotată @Configuration .

2. Configurare Maven

Pentru a utiliza Spring Security într-un proiect Maven, trebuie mai întâi să avem dependența spring-security-core în proiectul pom.xml :

 org.springframework.security spring-security-core 5.3.3.RELEASE 

Cea mai recentă versiune poate fi găsită întotdeauna aici.

3. Securitate web cu configurare Java

Să începem cu un exemplu de bază al unei configurații Java Spring Security:

@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user") .password(passwordEncoder().encode("password")).roles("USER"); } }

După cum probabil ați observat, configurația configurează o configurare de autentificare de bază în memorie. În plus, începând cu primăvara 5, avem nevoie de un bean PasswordEncoder :

@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

4. Securitate HTTP

Pentru a activa securitatea HTTP în primăvară, trebuie să extindem WebSecurityConfigurerAdapter pentru a furniza o configurație implicită în metoda configure (HttpSecurity http) :

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().httpBasic(); } 

Configurația implicită de mai sus se asigură că orice solicitare către aplicație este autentificată cu autentificare bazată pe formular sau autentificare de bază HTTP.

De asemenea, este exact similar cu următoarea configurație XML:

5. Conectare formular

Interesant, Spring Security generează automat o pagină de autentificare, pe baza caracteristicilor care sunt activate și utilizând valori standard pentru adresa URL care procesează datele de conectare trimise:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().formLogin() .loginPage("/login").permitAll(); }

Aici pagina de autentificare generată automat este convenabilă pentru a porni și a rula rapid.

6. Autorizarea cu roluri

Să configurăm acum câteva autorizări simple pe fiecare adresă URL folosind roluri:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").access("hasRole('USER')") .antMatchers("/admin/**").hasRole("ADMIN") .and() // some more method calls .formLogin(); }

Observați cum folosim atât API-ul sigur de tip - hasRole -, cât și API-ul bazat pe expresie, prin acces.

7. Deconectați-vă

La fel ca multe alte aspecte ale Securității de primăvară, deconectarea are unele valori implicite excelente oferite de cadru.

În mod implicit, o cerere de deconectare invalidează sesiunea, șterge orice cache de autentificare, șterge SecurityContextHolder și redirecționează către pagina de autentificare.

Iată o configurare simplă de deconectare:

protected void configure(HttpSecurity http) throws Exception { http.logout(); }

Cu toate acestea, dacă doriți să obțineți mai mult control asupra gestionarilor disponibili, iată cum va arăta o implementare mai completă:

protected void configure(HttpSecurity http) throws Exception { http.logout().logoutUrl("/my/logout") .logoutSuccessUrl("/my/index") .logoutSuccessHandler(logoutSuccessHandler) .invalidateHttpSession(true) .addLogoutHandler(logoutHandler) .deleteCookies(cookieNamesToClear) .and() // some other method calls }

8. Autentificare

Să aruncăm o privire la un alt mod de a permite autentificarea cu Spring Security.

8.1. Autentificare în memorie

Vom începe cu o configurație simplă, în memorie:

@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

8.2. Autentificare JDBC

Pentru a muta acest lucru în JDBC, tot ce trebuie să faceți este să definiți o sursă de date în cadrul aplicației - și să o utilizați direct:

@Autowired private DataSource dataSource; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .withDefaultSchema() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

Desigur, cu ambele exemple de mai sus, trebuie să definim și beanul PasswordEncoder așa cum este subliniat în secțiunea 3.

9. Concluzie

În acest tutorial rapid, am parcurs elementele de bază ale configurației Java pentru Spring Security și ne-am concentrat asupra probelor de cod care ilustrează cele mai simple scenarii de configurare.