Inleiding tot Java Config voor Spring Security

1. Overzicht

Dit artikel is een inleiding tot Java-configuratie voor Spring Security waarmee gebruikers Spring Security eenvoudig kunnen configureren zonder het gebruik van XML.

Java-configuratie is toegevoegd aan het Spring-framework in Spring 3.1 en uitgebreid naar Spring Security in Spring 3.2 en is gedefinieerd in een klasse met annotaties @Configuratie.

2. Maven-instellingen

Om Spring Security in een Maven-project te gebruiken, hebben we eerst het spring-security-core afhankelijkheid in het project pom.xml:

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

De laatste versie is hier altijd te vinden.

3. Webbeveiliging met Java-configuratie

Laten we beginnen met een eenvoudig voorbeeld van een Spring Security Java-configuratie:

@EnableWebSecurity public class SecurityConfig breidt WebSecurityConfigurerAdapter uit {@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) gooit Uitzondering {auth.inMemoryAuthentication (). WithUser ("user") .password (passwordEncoder (). Encode ("passwordEncoder ())). Encode (" passwordEncoder ())). GEBRUIKER"); }}

Zoals je misschien hebt gemerkt, stelt de configuratie een basisconfiguratie voor authenticatie in het geheugen in. Bovendien hebben we vanaf Spring 5 een Wachtwoord Encoder Boon:

@Bean public PasswordEncoder passwordEncoder () {retourneer nieuwe BCryptPasswordEncoder (); }

4. HTTP-beveiliging

Om HTTP-beveiliging in het voorjaar in te schakelen, moeten we het WebSecurityConfigurerAdapter om een ​​standaardconfiguratie in het configureren (HttpSecurity http) methode:

beschermde leegte configureren (HttpSecurity http) gooit Uitzondering {http.authorizeRequests () .anyRequest (). geverifieerd (). en (). httpBasic (); } 

De bovenstaande standaardconfiguratie zorgt ervoor dat elk verzoek aan de applicatie wordt geauthenticeerd met formuliergebaseerde login of HTTP-basisauthenticatie.

Het lijkt ook precies op de volgende XML-configuratie:

5. Inloggen formulier

Interessant is dat Spring Security automatisch een inlogpagina genereert, op basis van de functies die zijn ingeschakeld en met behulp van standaardwaarden voor de URL die de ingediende login verwerkt:

protected void configure (HttpSecurity http) gooit uitzondering {http.authorizeRequests () .anyRequest (). geverifieerd (). en (). formLogin () .loginPage ("/ login"). allowAll (); }

Hier is de automatisch gegenereerde inlogpagina handig om snel aan de slag te gaan.

6. Autorisatie met rollen

Laten we nu enkele eenvoudige autorisaties configureren voor elke URL met behulp van rollen:

protected void configure (HttpSecurity http) gooit uitzondering {http.authorizeRequests () .antMatchers ("/", "/home").access("hasRole('USER ')") .antMatchers ("/ admin / **") .hasRole ("ADMIN") .and () // nog enkele methodeaanroepen .formLogin (); }

Merk op hoe we zowel de typeveilige API gebruiken - hasRole - maar ook de op expressie gebaseerde API, via toegang.

7. Uitloggen

Net als veel andere aspecten van Spring Security, heeft uitloggen een aantal geweldige standaardinstellingen die door het framework worden geboden.

Standaard maakt een uitlogverzoek de sessie ongeldig, worden alle authenticatiecaches gewist en het SecurityContextHolder en verwijst door naar de inlogpagina.

Hier is een eenvoudige uitlogconfiguratie:

beschermde leegte configureren (HttpSecurity http) gooit uitzondering {http.logout (); }

Als u echter meer controle wilt krijgen over de beschikbare handlers, dan ziet een completere implementatie er als volgt uit:

protected void configure (HttpSecurity http) gooit uitzondering {http.logout (). logoutUrl ("/ my / logout") .logoutSuccessUrl ("/ my / index") .logoutSuccessHandler (logoutSuccessHandler) .invalidateHttpSession (true) .addLogoutHandler (logoutHandler) .deleteCookies (cookieNamesToClear) .and () // een andere methode aanroepen}

8. Authenticatie

Laten we eens kijken naar een andere manier om authenticatie met Spring Security toe te staan.

8.1. Authenticatie in het geheugen

We beginnen met een eenvoudige configuratie in het geheugen:

@Autowired public void configureGlobal (AuthenticationManagerBuilder auth) genereert Uitzondering {auth.inMemoryAuthentication () .withUser ("gebruiker"). Wachtwoord (passwordEncoder (). Encode ("wachtwoord")). Rollen ("USER") .en (). withUser ("admin"). wachtwoord (passwordEncoder (). encode ("wachtwoord")). rollen ("USER", "ADMIN"); } 

8.2. JDBC-verificatie

Om dat naar JDBC te verplaatsen, hoeft u alleen maar een gegevensbron binnen de applicatie te definiëren - en die direct te gebruiken:

@Autowired privé DataSource dataSource; @Autowired public void configureGlobal (AuthenticationManagerBuilder auth) genereert Uitzondering {auth.jdbcAuthentication (). DataSource (dataSource) .withDefaultSchema () .withUser ("gebruiker"). Wachtwoord (passwordEncoder (). Encode ("wachtwoord")). Rollen ( "USER") .en () .withUser ("admin"). Wachtwoord (passwordEncoder (). Encode ("wachtwoord")). Rollen ("USER", "ADMIN"); } 

Met beide bovenstaande voorbeelden moeten we natuurlijk ook de Wachtwoord Encoder bonen zoals beschreven in Sectie 3.

9. Conclusie

In deze korte zelfstudie hebben we de basisprincipes van Java-configuratie voor Spring Security besproken en ons gericht op de codevoorbeelden die de eenvoudigste configuratiescenario's illustreren.