Toegekende autoriteit versus rol in Spring Security

1. Overzicht

In dit korte artikel leggen we het uit het subtiele maar significante verschil tussen a Rol en een ToegegevenAuthority in Spring Security. Zie het artikel hier voor meer informatie over rollen en bevoegdheden.

2. ToegegevenAuthority

In Spring Security kunnen we dat denk aan elk ToegegevenAuthority als een individueel voorrecht. Voorbeelden kunnen zijn: READ_AUTHORITY, WRITE_PRIVILEGE, of zelfs CAN_EXECUTE_AS_ROOT. Het belangrijkste om te begrijpen is dat de naam is willekeurig.

Bij gebruik van een ToegegevenAuthority rechtstreeks, zoals door het gebruik van een uitdrukking zoals hasAuthority (‘READ_AUTHORITY '), wij zijn toegang op een fijnmazige manier beperken.

Zoals u waarschijnlijk wel kunt begrijpen, kunnen we verwijzen naar het concept van Gezag door het gebruiken van voorrecht ook.

3. Rol als autoriteit

Evenzo kunnen we dat in Spring Security denk aan elk Rol als een grofkorrelige ToegegevenAuthority dat wordt weergegeven als een Draad en voorafgegaan door 'ROL. Bij gebruik van een Rol rechtstreeks, zoals via een uitdrukking als hasRole ("ADMIN"), beperken we de toegang op een grofkorrelige manier.

Het is vermeldenswaard dat de standaard “ROL" prefix is ​​configureerbaar, maar uitleggen hoe dat moet, valt buiten het bestek van dit artikel.

Het belangrijkste verschil tussen deze twee is de semantiek die we hechten aan hoe we de functie gebruiken. Voor het framework is het verschil minimaal - en het behandelt deze in principe op precies dezelfde manier.

4. Rol als container

Nu we hebben gezien hoe het framework het rol concept, laten we ook snel een alternatief bespreken - en dat is rollen gebruiken als containers van autoriteiten / privileges.

Dit is een benadering op een hoger niveau van rollen, waardoor ze een meer zakelijk concept worden in plaats van een implementatiegericht concept.

Het Spring Security-raamwerk geeft geen enkele leidraad in termen van hoe we het concept moeten gebruiken, dus de keuze is volledig implementatiespecifiek.

5. Spring-beveiligingsconfiguratie

We kunnen een fijnmazige autorisatie-eis aantonen door de toegang te beperken tot / protecteddoorautoriteit aan gebruikers met READ_AUTHORITY.

We kunnen een grofkorrelige autorisatie-eis aantonen door de toegang te beperken tot / protectedbyrole aan gebruikers met ROLE_USER.

Laten we een dergelijk scenario configureren in onze beveiligingsconfiguratie:

@Override protected void configure (HttpSecurity http) gooit uitzondering {// ... .antMatchers ("/ protectedbyrole"). HasRole ("USER") .antMatchers ("/ protectedbyauthority"). HasAuthority ("READ_PRIVILEGE") //. ..}

6. Eenvoudige gegevensinit

Nu we de kernconcepten beter begrijpen, gaan we het hebben over het maken van enkele installatiegegevens wanneer de applicatie opstart.

Dit is natuurlijk een heel eenvoudige manier om dat te doen, om tijdens de ontwikkeling met enkele voorlopige testgebruikers aan de slag te gaan - niet de manier waarop je met gegevens in productie moet omgaan.

We gaan luisteren naar de gebeurtenis voor het vernieuwen van de context:

@Override @Transactional public void onApplicationEvent (ContextRefreshedEvent-gebeurtenis) {MyPrivilege readPrivilege = createPrivilegeIfNotFound ("READ_PRIVILEGE"); MyPrivilege writePrivilege = createPrivilegeIfNotFound ("WRITE_PRIVILEGE"); }

De daadwerkelijke implementatie hier doet er niet echt toe - en hangt over het algemeen af ​​van de persistentie-oplossing die u gebruikt. Het belangrijkste punt is: we zetten de autoriteiten die we in de code gebruiken, vol.

7. UserDetailsService

Onze implementatie van UserDetailsService is waar de autoriteit in kaart wordt gebracht. Zodra de gebruiker zich heeft geauthenticeerd, onze getAuthorities () methode vult en retourneert een Gebruikersdetails voorwerp:

privéverzameling getAuthorities (verzamelingsrollen) {lijst autoriteiten = nieuwe ArrayList (); voor (Rolrol: rollen) {autoriteiten.add (nieuwe SimpleGrantedAuthority (role.getName ())); role.getPrivileges (). stream () .map (p -> nieuwe SimpleGrantedAuthority (p.getName ())) .forEach (autoriteiten :: add); } terugkeerautoriteiten; }

8. Het voorbeeld uitvoeren en testen

We kunnen het voorbeeld uitvoeren RolesAuthoritiesApplication Java-applicatie, gevonden in het GitHub-project.

Om de op rollen gebaseerde autorisatie in actie te zien, moeten we:

  • Toegang // localhost: 8082 / protectedbyrole
  • Verifiëren als [e-mail beveiligd] (wachtwoord is "gebruiker")
  • Let op succesvolle autorisatie
  • Toegang // localhost: 8082 / protectedbyauthority
  • Let op mislukte autorisatie

Om autorisatie op basis van autoriteit in actie te zien, moeten we uitloggen bij de applicatie en vervolgens:

  • Toegang // localhost: 8082 / protectedbyauthority
  • Verifieer als [e-mail beschermd] / admin
  • Let op succesvolle autorisatie
  • Toegang // localhsot: 8082 / protectedbyrole
  • Let op mislukte autorisatie

9. Conclusie

In deze korte tutorial hebben we gekeken naar het subtiele maar significante verschil tussen a Rol en een ToegegevenAuthority in Spring Security.