Spring Security Basic Authentication

1. Overzicht

Deze tutorial laat zien hoe je moet instellen, configureren en aanpassen Basisverificatie met Spring. We gaan bovenop het eenvoudige Spring MVC-voorbeeld bouwen en de gebruikersinterface van de MVC-applicatie beveiligen met het Basic Auth-mechanisme van Spring Security.

2. De Spring-beveiligingsconfiguratie

We kunnen Spring Security configureren met behulp van Java-configuratie:

@Configuration @EnableWebSecurity openbare klasse CustomWebSecurityConfigurerAdapter breidt WebSecurityConfigurerAdapter uit {@Autowired privé MyBasicAuthenticationEntryPoint authenticationEntryPoint; @Autowired public void configureGlobal (AuthenticationManagerBuilder auth) genereert Uitzondering {auth.inMemoryAuthentication () .withUser ("user1"). Wachtwoord (passwordEncoder (). Encode ("user1Pass")) .authorities ("ROLE_USER"); } @Override protected void configure (HttpSecurity http) genereert uitzondering {http.authorizeRequests () .antMatchers ("/ securityNone"). AllowAll () .anyRequest (). Authenticated () .and () .httpBasic () .authenticationEntryPoint (authenticationEntryPoint (authenticationEntryPoint) ); http.addFilterAfter (nieuwe CustomFilter (), BasicAuthenticationFilter.class); } @Bean public PasswordEncoder passwordEncoder () {retourneer nieuwe BCryptPasswordEncoder (); }}

Hier gebruiken we de httpBasic () element om basisverificatie te definiëren, binnen het configureren () methode van een klasse die zich uitbreidt WebSecurityConfigurerAdapter.

Hetzelfde kan ook worden bereikt met XML:

Wat hier relevant is, is het element in de main element van de configuratie - dit is voldoende om basisverificatie in te schakelen voor de hele applicatie. De Authentication Manager is niet de focus van deze tutorial, dus we gebruiken een in-memory manager met de gebruiker en het wachtwoord gedefinieerd in platte tekst.

De web.xml van de webapplicatie die Spring Security mogelijk maakt, is al besproken in de Spring Logout-tutorial.

3. Gebruik van de beveiligde applicatie

De krullen command is onze go-to tool om de beveiligde applicatie te gebruiken.

Laten we eerst proberen om het /homepage.html zonder enige beveiligingsreferenties op te geven:

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

We krijgen het verwachte terug 401 Niet geautoriseerd en de authenticatie-uitdaging:

HTTP / 1.1 401 Ongeautoriseerde server: Apache-Coyote / 1.1 Set-Cookie: JSESSIONID = E5A8D3C16B65A0A007CFAACAEEE6916B; Pad = / spring-security-mvc-basic-auth /; HttpOnly WWW-Authenticate: Basic realm = "Spring Security Application" Content-Type: text / html; charset = utf-8 Content-lengte: 1061 Datum: wo 29 mei 2013 15:14:08 GMT

De browser zou deze uitdaging interpreteren en ons om referenties vragen met een eenvoudig dialoogvenster, maar aangezien we krullen, dit is niet het geval.

Laten we nu dezelfde bron aanvragen - de startpagina - maar verstrek de inloggegevens om er ook toegang toe te krijgen:

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

Nu is het antwoord van de server 200 OK samen met een Koekje:

HTTP / 1.1 200 OK Server: Apache-Coyote / 1.1 Set-Cookie: JSESSIONID = 301225C7AE7C74B0892887389996785D; Pad = / spring-security-mvc-basic-auth /; HttpOnly Content-Type: text / html; charset = ISO-8859-1 Content-Language: en-US Content-Length: 90 Datum: wo, 29 mei 2013 15:19:38 GMT

Vanuit de browser kan de applicatie normaal worden gebruikt - het enige verschil is dat een inlogpagina niet langer een harde vereiste is, aangezien alle browsers basisverificatie ondersteunen en een dialoogvenster gebruiken om de gebruiker om inloggegevens te vragen.

4. Verdere configuratie - thij toegangspunt

Standaard is het BasicAuthenticationEntryPoint geleverd door Spring Security retourneert een volledige pagina voor een 401 Niet geautoriseerd antwoord terug naar de klant. Deze HTML-weergave van de fout wordt goed weergegeven in een browser, maar is niet erg geschikt voor andere scenario's, zoals een REST API waar een json-weergave de voorkeur kan hebben.

De naamruimte is ook flexibel genoeg voor deze nieuwe vereiste - om dit aan te pakken - kan het toegangspunt worden overschreven:

Het nieuwe instappunt is gedefinieerd als een standaardboon:

@Component openbare klasse MyBasicAuthenticationEntryPoint breidt BasicAuthenticationEntryPoint uit {@Override public void start (HttpServletRequest-verzoek, HttpServletResponse-antwoord, AuthenticationException authEx) gooit IOException, ServletException {response.addHeader ("," WWW-Authenticate + "," response.setStatus (HttpServletResponse.SC_UNAUTHORIZED); PrintWriter-schrijver = response.getWriter (); writer.println ("HTTP-status 401 -" + authEx.getMessage ()); } @Override public void afterPropertiesSet () gooit uitzondering {setRealmName ("Baeldung"); super.afterPropertiesSet (); }}

Door rechtstreeks naar de HTTP-respons te schrijven, hebben we nu volledige controle over het formaat van de responsbody.

5. De afhankelijkheden van Maven

De Maven-afhankelijkheden voor Spring Security zijn eerder besproken in het artikel Spring Security with Maven - we hebben beide nodig spring-security-web en spring-security-config beschikbaar tijdens runtime.

6. Conclusie

In dit voorbeeld hebben we een MVC-applicatie beveiligd met Spring Security en Basic Authentication. We bespraken de XML-configuratie en we gebruikten de applicatie met eenvoudige curl-opdrachten. Eindelijk de controle over het exacte foutberichtformaat overgenomen - van de standaard HTML-foutpagina naar een aangepaste tekst- of JSON-indeling.

De volledige implementatie van deze tutorial is te vinden in het GitHub-project - dit is een op Maven 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-rest-basic-auth / api / foos / 1.