Spring Security Form Login

1. Inleiding

Dit artikel gaat zich concentreren op Log in met Spring Security. We gaan voortbouwen op het eenvoudige vorige Spring MVC-voorbeeld, want dat is een noodzakelijk onderdeel van het opzetten van de webapplicatie samen met het inlogmechanisme.

2. De afhankelijkheden van Maven

Wanneer u met Spring Boot werkt, is het spring-boot-starter-security starter zal automatisch alle afhankelijkheden opnemen, zoals spring-security-core, spring-security-web en spring-security-config onder andere:

 org.springframework.boot spring-boot-starter-security 2.3.3.RELEASE 

Als we Spring Boot niet gebruiken, raadpleeg dan het artikel Spring Security with Maven, waarin wordt beschreven hoe u alle vereiste afhankelijkheden toevoegt. Beide standaard spring-security-web en spring-security-config zal vereist zijn.

3. Spring Security Java-configuratie

Laten we beginnen met het maken van een Spring Security-configuratieklasse die uitbreidt WebSecurityConfigurerAdapter.

Door toe te voegen @EnableWebSecuritykrijgen we ondersteuning voor Spring Security en MVC-integratie:

@Configuration @EnableWebSecurity openbare klasse SecSecurityConfig breidt WebSecurityConfigurerAdapter uit {@Override protected void configure (laatste AuthenticationManagerBuilder auth) gooit uitzondering {// authenticatiebeheerder (zie hieronder)} @Override beschermde ongeldige configuratie (laatste HttpSecurity http) genereert uitzondering { voor autorisatieverzoeken en inloggen via formulieren (zie hieronder)}}

In dit voorbeeld hebben we in-memory authenticatie gebruikt en 3 gebruikers gedefinieerd.

Vervolgens gaan we door de elementen die we hebben gebruikt om de inlogconfiguratie voor het formulier te maken.

Laten we eerst onze Authentication Manager bouwen.

3.1. Authenticatie Manager

De authenticatieleverancier wordt ondersteund door een eenvoudige implementatie in het geheugen - InMemoryUserDetailsManager specifiek. Dit is handig voor snelle prototyping wanneer een volledig persistentiemechanisme nog niet nodig is:

protected void configure (laatste AuthenticationManagerBuilder auth) genereert Uitzondering {auth.inMemoryAuthentication () .withUser ("user1"). wachtwoord (passwordEncoder (). encode ("user1Pass")). rollen ("USER") .en () .withUser ("user2"). wachtwoord (passwordEncoder (). encode ("user2Pass")). rollen ("USER") .en () .withUser ("admin"). wachtwoord (passwordEncoder (). encode ("adminPass") ) .roles ("ADMIN"); }

Hier configureren we drie gebruikers met de gebruikersnaam, het wachtwoord en de rol hard gecodeerd.

Vanaf Spring 5 moeten we ook een wachtwoord-encoder definiëren. In ons voorbeeld hebben we de BCryptPasswordEncoder:

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

Laten we vervolgens het HttpSecurity.

3.2. Configuratie om verzoeken te autoriseren

We beginnen met het uitvoeren van de nodige configuraties om verzoeken te autoriseren.

Hier staan ​​we anonieme toegang toe op /Log in zodat gebruikers zich kunnen authenticeren. Beperkend /beheerder naar BEHEERDER rollen en het beveiligen van al het andere:

@Override protected void configure (laatste HttpSecurity http) gooit uitzondering {http .csrf (). Disable () .authorizeRequests () .antMatchers ("/ admin / **"). HasRole ("ADMIN") .antMatchers ("/ anonymous * "). anonymous () .antMatchers (" / login * "). allowAll () .anyRequest (). geverifieerd (). en () // ...}

Merk op dat de volgorde van de antMatchers () elementen zijn significant - de meer specifieke regels moeten eerst komen, gevolgd door de meer algemene regels.

3.3. Configuratie voor inloggen op formulier

Vervolgens breiden we de bovenstaande configuratie uit voor het inloggen en uitloggen via een formulier:

@Override protected void configure (final HttpSecurity http) gooit uitzondering {http // ... .and () .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ perform_login") .defaultSuccessUrl ("/ homepage.html ", true) .failureUrl (" / login.html? error = true ") .failureHandler (authenticationFailureHandler ()) .and () .logout () .logoutUrl (" / perform_logout ") .deleteCookies (" JSESSIONID " ) .logoutSuccessHandler (logoutSuccessHandler ()); }
  • login pagina() - de aangepaste inlogpagina
  • loginProcessingUrl () - de URL waarnaar de gebruikersnaam en het wachtwoord moeten worden verzonden
  • defaultSuccessUrl () - de landingspagina na een succesvolle login
  • failureUrl () - de bestemmingspagina na een mislukte login
  • logoutUrl () - de aangepaste afmelding

4. Voeg Spring Security toe aan de webapplicatie

Om de hierboven gedefinieerde Spring Security-configuratie te gebruiken, moeten we deze aan de webapplicatie koppelen.

We gebruiken de WebApplicationInitializer, dus we hoeven er geen te verstrekken web.xml:

openbare klasse AppInitializer implementeert WebApplicationInitializer {@Override public void onStartup (ServletContext sc) {AnnotationConfigWebApplicationContext root = nieuwe AnnotationConfigWebApplicationContext (); root.register (SecSecurityConfig.class); sc.addListener (nieuwe ContextLoaderListener (root)); sc.addFilter ("securityFilter", nieuwe DelegatingFilterProxy ("springSecurityFilterChain")) .addMappingForUrlPatterns (null, false, "/ *"); }}

Merk op dat deze initialisatie niet nodig is als we een Spring Boot-applicatie gebruiken. Bekijk ons ​​artikel over automatische configuratie van Spring Boot-beveiliging voor meer informatie over hoe de beveiligingsconfiguratie wordt geladen in Spring Boot.

5. De Spring Security XML-configuratie

Laten we ook eens kijken naar de bijbehorende XML-configuratie.

Het totale project maakt gebruik van Java-configuratie, dus we moeten het XML-configuratiebestand via Java importeren @Configuratie klasse:

@Configuration @ImportResource ({"classpath: webSecurityConfig.xml"}) openbare klasse SecSecurityConfig {openbare SecSecurityConfig () {super (); }}

En de Spring Security XML-configuratie - webSecurityConfig.xml:

6. Het web.xml

Voor de introductie van Spring 4, hebben we Spring Security-configuratie geconfigureerd in het web.xml - alleen een extra filter toegevoegd aan de standaard Spring MVC web.xml:

Veerbeveiligde toepassing springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain / * 

Het filter - DelegatingFilterProxy - gewoon delegeert naar een door Spring beheerde boon - de FilterChainProxy - die zelf kan profiteren van het volledige levenscyclusbeheer van Spring bean en dergelijke.

7. Het aanmeldingsformulier

De aanmeldingsformulierpagina wordt geregistreerd bij Spring MVC met behulp van het eenvoudige mechanisme om weergavenamen toe te wijzen aan URL's zonder dat een expliciete controller ertussen nodig is:

registry.addViewController ("/ login.html");

Dit komt natuurlijk overeen met de login.jsp:

Gebruiker:
Wachtwoord:

De Spring Login-formulier heeft de volgende relevante artefacten:

  • Log in - de URL waar het formulier is geplaatst om het authenticatieproces te starten
  • gebruikersnaam - de gebruikersnaam
  • wachtwoord - het wachtwoord

8. Verdere configuratie van Spring Login

We hebben kort enkele configuraties van het inlogmechanisme besproken toen we de Spring Security Configuration hierboven introduceerden - laten we nu wat in detail gaan.

Een reden om de meeste standaardinstellingen in Spring Security op te heffen, is door verberg het feit dat de applicatie is beveiligd met Spring Security en minimaliseer de informatie die een potentiële aanvaller over de applicatie weet.

Volledig geconfigureerd ziet het login-element er als volgt uit:

@Override protected void configure (HttpSecurity http) gooit uitzondering {http.formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ perform_login") .defaultSuccessUrl ("/ homepage.html", true) .failureUrl ( "/login.html?error=true")}

Of de bijbehorende XML-configuratie:

8.1. De aanmeldingspagina

Laten we vervolgens kijken hoe we een aangepaste inlogpagina kunnen configureren met behulp van de loginPage () methode:

http.formLogin () .loginPage ("/ login.html")

Of via XML-configuratie:

login-page = '/ login.html'

Als we dit niet specificeren, genereert Spring Security een heel eenvoudig aanmeldingsformulier op het /Log in URL.

8.2. De POST-URL voor inloggen

De standaard-URL waar de Spring Login POST zal plaatsen om het authenticatieproces te activeren is /Log in die vroeger was / j_spring_security_check voor Spring Security 4.

We kunnen de loginProcessingUrl methode om deze URL te overschrijven:

http.formLogin () .loginProcessingUrl ("/ perform_login")

Of, via XML-configuratie:

login-processing-url = "/ perform_login"

Een goede reden om deze standaard-URL te overschrijven, is om te verbergen dat de applicatie daadwerkelijk is beveiligd met Spring Security - die informatie mag niet extern beschikbaar zijn.

8.3. De bestemmingspagina over succes

Na een succesvol inlogproces wordt de gebruiker omgeleid naar een pagina, die standaard de root van de webapplicatie is.

We kunnen dit opheffen via de defaultSuccessUrl () methode:

http.formLogin () .defaultSuccessUrl ("/ homepage.html")

Of met XML-configuratie:

default-target-url = "/ homepage.html"

In het geval dat de always-use-default-target is ingesteld op true, dan wordt de gebruiker altijd doorgestuurd naar deze pagina. Als dat attribuut is ingesteld op false, wordt de gebruiker omgeleid naar de vorige pagina die ze wilden bezoeken voordat wordt gevraagd om te authenticeren.

8,4. De bestemmingspagina over mislukking

Net als bij de aanmeldingspagina, wordt de aanmeldingsfoutpagina automatisch gegenereerd door Spring Security op /Log in?fout standaard.

Om dit op te heffen, kunnen we de failureUrl () methode:

http.formLogin () .failureUrl ("/ login.html? error = true")

Of met XML:

authentication-failure-url = "/ login.html? error = true"

9. Conclusie

In deze Voorbeeld Spring Loginhebben we een eenvoudig authenticatieproces geconfigureerd - we hebben het Spring Security-aanmeldingsformulier, de beveiligingsconfiguratie en enkele van de meer geavanceerde beschikbare aanpassingen besproken.

De implementatie van deze Spring Login-zelfstudie is te vinden in het GitHub-project - dit is een op Eclipse gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.

Wanneer het project lokaal wordt uitgevoerd, is de voorbeeld-HTML toegankelijk via:

//localhost:8080/spring-security-mvc-login/login.html