Inleiding tot Spring Security Expressions

1. Inleiding

In deze tutorial zullen we ons concentreren op Spring Security Expressions, en natuurlijk op praktische voorbeelden met deze uitdrukkingen.

Voordat u naar complexere implementaties (zoals ACL) kijkt, is het belangrijk om een ​​goed begrip te hebben van beveiligingsuitdrukkingen - aangezien ze behoorlijk flexibel en krachtig kunnen zijn als ze correct worden gebruikt.

Dit artikel is een uitbreiding van Spring Security Expressions - hasRole Example.

2. Maven afhankelijkheden

Om Spring Security te gebruiken, moet u de volgende sectie opnemen in uw pom.xml het dossier:

  org.springframework.security spring-security-web 5.2.3.RELEASE 

De laatste versie is hier te vinden.

En een korte opmerking: deze afhankelijkheid dekt alleen Spring Security; vergeet niet s toe te voegenpring-core en lente-context voor een volledige webapplicatie.

3. Configuratie

Laten we eerst eens kijken naar een Java-configuratie.

We verlengen WebSecurityConfigurerAdapter - zodat we de mogelijkheid hebben om in te haken op een van de uitbreidingspunten die de basisklasse biedt:

@Configuration @EnableAutoConfiguration @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) openbare klasse SecurityJavaConfig breidt WebSecurityConfigurerAdapter uit {...}

We kunnen natuurlijk ook een XML-configuratie doen:

4. Webbeveiligingsuitdrukkingen

Laten we nu eens kijken naar de beveiligingsuitdrukkingen:

  • hasRole, hasAnyRole
  • hasAuthority, hasAnyAuthority
  • vergunningAll, alles ontkennen
  • isAnoniem, isRememberMe, isAuthenticated, isFullyAuthenticated
  • opdrachtgever, authenticatie
  • hasPermission

En laten we nu elk van deze in detail bespreken.

4.1. hasRole, hasAnyRole

Deze uitdrukkingen zijn verantwoordelijk voor het definiëren van de toegangscontrole of autorisatie voor specifieke URL's of methoden in uw applicatie.

Laten we naar het voorbeeld kijken:

@Override protected void configure (laatste HttpSecurity http) gooit uitzondering {... .antMatchers ("/ auth / admin / *"). HasRole ("ADMIN") .antMatchers ("/ auth / *"). HasAnyRole ("ADMIN "," USER ") ...} 

In dit voorbeeld specificeren we de toegang tot alle links die beginnen met / auth / beperkt tot gebruikers die zijn aangemeld met rol GEBRUIKER of rol BEHEERDER. Bovendien om toegang te krijgen tot links die beginnen met / auth / admin / we moeten hebben BEHEERDER rol in het systeem.

Dezelfde configuratie kan worden bereikt in een XML-bestand, door te schrijven:

4.2. hasAuthority, hasAnyAuthority

Rollen en bevoegdheden zijn vergelijkbaar in het voorjaar.

Het belangrijkste verschil is dat rollen een speciale betekenis hebben - te beginnen met Spring Security 4, de 'ROL_‘Prefix wordt automatisch toegevoegd (als het er nog niet is) door een rolgerelateerde methode.

Zo hasAuthority (‘ROLE_ADMIN ') is gelijkaardig aan hasRole (‘ADMIN ') omdat de ‘ROL_‘Prefix wordt automatisch toegevoegd.

Maar het goede aan het gebruik van autoriteiten is dat we de ROL_ voorvoegsel helemaal.

Hier is een kort voorbeeld waarin we gebruikers met specifieke bevoegdheden definiëren:

@Override protected void configure (AuthenticationManagerBuilder auth) genereert Uitzondering {auth.inMemoryAuthentication () .withUser ("user1"). Wachtwoord (encoder (). Encode ("user1Pass")) .authorities ("USER") .and (). withUser ("admin"). wachtwoord (encoder (). encode ("adminPass")) .authorities ("ADMIN"); } 

We kunnen dan natuurlijk deze gezagsuitdrukkingen gebruiken:

@Override protected void configure (final HttpSecurity http) gooit uitzondering {... .antMatchers ("/ auth / admin / *"). HasAuthority ("ADMIN") .antMatchers ("/ auth / *"). HasAnyAuthority ("ADMIN "," USER ") ...}

Zoals we kunnen zien, noemen we hier helemaal geen rollen. Bovendien hebben we vanaf Spring 5 een Wachtwoord Encoder Boon:

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

Ten slotte - we kunnen natuurlijk dezelfde functionaliteit ook bereiken met XML-configuratie:

En:

4.3. allowAll, denyAll

Die twee annotaties zijn ook vrij eenvoudig. We kunnen toegang tot een URL in onze service toestaan ​​of we kunnen de toegang weigeren.

Laten we het voorbeeld eens bekijken:

... .antMatchers ("/ *"). allowAll () ...

Met deze configuratie machtigen we alle gebruikers (zowel anoniem als ingelogd) om toegang te krijgen tot de pagina die begint met ‘/ '(bijvoorbeeld onze startpagina).

We kunnen ook de toegang tot onze volledige URL-ruimte weigeren:

... .antMatchers ("/ *"). denyAll () ...

En nogmaals, dezelfde configuratie kan ook worden gedaan met een XML-configuratie:

4.4. isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated

In deze subsectie richten we ons op uitdrukkingen die verband houden met de inlogstatus van de gebruiker. Laten we beginnen met een gebruiker die niet is ingelogd op onze pagina. Door het volgende te specificeren in de Java-configuratie, stellen we alle ongeautoriseerde gebruikers in staat om toegang te krijgen tot onze hoofdpagina:

... .antMatchers ("/ *"). anoniem () ...

Hetzelfde in XML-configuratie:

Als we de website willen beveiligen dat iedereen die deze gebruikt, moet inloggen, moeten we deze gebruiken isAuthenticated () methode:

... .antMatchers ("/ *"). geverifieerd () ...

of XML-versie:

Bovendien hebben we twee extra uitdrukkingen, isRememberMe () en isFullyAuthenticated (). Door het gebruik van cookies maakt Spring onthoud-mij-mogelijkheden mogelijk, zodat u niet elke keer op het systeem hoeft in te loggen. U kunt er meer over lezen Onthoud me hier.

Om toegang te geven aan gebruikers die alleen waren ingelogd met de functie Onthoud mij, kunnen we dit gebruiken:

... .antMatchers ("/ *"). RememberMe () ...

of XML-versie:

Ten slotte vereisen sommige delen van onze diensten dat de gebruiker opnieuw wordt geauthenticeerd, zelfs als de gebruiker al is ingelogd. De gebruiker wil bijvoorbeeld instellingen of betalingsinformatie wijzigen; Het is natuurlijk een goede gewoonte om handmatige authenticatie te vragen in de meer gevoelige delen van het systeem.

Om dat te doen, kunnen we specificeren isFullyAuthenticated (), die terugkeert waar als de gebruiker geen anonieme gebruiker of een onthoud-mij-gebruiker is:

... .antMatchers ("/ *"). FullyAuthenticated () ...

of de XML-versie:

4.5. principal, authenticatie

Deze uitdrukkingen geven toegang tot het opdrachtgever object dat de huidige geautoriseerde (of anonieme) gebruiker en de huidige Authenticatie object uit de SecurityContext, respectievelijk.

We kunnen bijvoorbeeld gebruik maken van opdrachtgever om de e-mail, avatar of andere gegevens van een gebruiker te laden die toegankelijk zijn voor de ingelogde gebruiker.

En authenticatie geeft informatie over het volledige Authenticatie object, samen met de verleende bevoegdheden.

Beide worden in meer detail beschreven in het volgende artikel: Gebruikersinformatie ophalen in Spring Security.

4.6. hasPermission API's

Deze uitdrukking is gedocumenteerd en bedoeld om een ​​brug te slaan tussen het expressiesysteem en het ACL-systeem van Spring Security, waardoor we autorisatiebeperkingen kunnen specificeren voor individuele domeinobjecten, op basis van abstracte machtigingen.

Laten we een voorbeeld bekijken. We hebben een service die het mogelijk maakt om samen artikelen te schrijven, waarbij een hoofdredacteur beslist welk artikel dat door andere auteurs wordt voorgesteld, moet worden gepubliceerd.

Om het gebruik van een dergelijke service mogelijk te maken, kunnen we de volgende methoden met toegangscontrolemethoden creëren:

@PreAuthorize ("hasPermission (#articleId, 'isEditor')") public void acceptArticle (artikelartikel) {…}

Alleen geautoriseerde gebruiker kan deze methode aanroepen, en ook de gebruiker heeft toestemming nodig isEditor in de dienst.

We moeten ook onthouden om expliciet een Toestemming Evaluator in onze toepassingscontext:

waar customInterfaceImplementation zal de klasse zijn die implementeert Toestemming Evaluator.

Natuurlijk kunnen we dit ook doen met Java-configuratie:

@Override beschermde MethodSecurityExpressionHandler expressionHandler () {DefaultMethodSecurityExpressionHandler expressionHandler = nieuwe DefaultMethodSecurityExpressionHandler (); expressionHandler.setPermissionEvaluator (nieuwe CustomInterfaceImplementation ()); return expressionHandler; }

5. Conclusie

Deze tutorial is een uitgebreide inleiding en gids voor Spring Security Expressions.

Alle voorbeelden die hier worden besproken, zijn beschikbaar in het GitHub-project.


$config[zx-auto] not found$config[zx-overlay] not found