Bevilget myndighed versus rolle i forårssikkerhed

1. Oversigt

I denne hurtige artikel forklarer vi den subtile men signifikante forskel mellem a Rolle og en Bevilget autoritet i forårssikkerhed. For mere detaljeret information om roller og myndigheder, se artiklen her.

2. Bevilget autoritet

I forårssikkerhed kan vi tænk på hver Bevilget autoritet som et individuelt privilegium. Eksempler kan omfatte LÆS_AUTHORITET, WRITE_PRIVILEGE, eller endda CAN_EXECUTE_AS_ROOT. Det vigtige at forstå er, at navnet er vilkårligt.

Når du bruger en Bevilget autoritet direkte, såsom ved brug af et udtryk som hasAuthority (‘READ_AUTHORITY '), vi er begrænsning af adgang på en finkornet måde.

Som du sandsynligvis kan samle, kan vi henvise til begrebet myndighed ved hjælp af privilegium såvel.

3. Roll som autoritet

På samme måde kan vi i Spring Security tænk på hver Roll som en grovkornet Bevilget autoritet der er repræsenteret som en Snor og præfikset med “ROLLE. Når du bruger en Rolle direkte, f.eks. gennem et udtryk som hasRole (“ADMIN”), vi begrænser adgangen på en grovkornet måde.

Det er værd at bemærke, at standard “ROLLE ” præfikset kan konfigureres, men at forklare, hvordan man gør det, ligger uden for denne artikels anvendelsesområde.

Kerneforskellen mellem disse to er den semantik, vi lægger til, hvordan vi bruger funktionen. For rammen er forskellen minimal - og den handler grundlæggende med disse på nøjagtig samme måde.

4. Roll som beholder

Nu hvor vi har set, hvordan rammen bruger rolle koncept, lad os også hurtigt diskutere et alternativ - og det er ved hjælp af roller som containere med autoriteter / privilegier.

Dette er en højere tilgang til roller - hvilket gør dem til et mere forretningsmæssigt koncept snarere end et implementeringscentreret.

Spring Security-rammen giver ingen vejledning i, hvordan vi skal bruge konceptet, så valget er helt implementeringsspecifikt.

5. Forårssikkerhedskonfiguration

Vi kan demonstrere et finkornet autorisationskrav ved at begrænse adgangen til / beskyttet af autoritet til brugere med LÆS_AUTHORITET.

Vi kan demonstrere et grovkornet autorisationskrav ved at begrænse adgangen til / protectedbyrole til brugere med ROLE_USER.

Lad os konfigurere et sådant scenario i vores sikkerhedskonfiguration:

@ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {// ... .antMatchers ("/ protectedbyrole"). HasRole ("USER") .antMatchers ("/ protectedbyauthority"). HasAuthority ("READ_PRIVILEGE") //. ..}

6. Enkel start af data

Nu hvor vi forstår kernebegreberne bedre, lad os tale om at oprette nogle installationsdata, når applikationen starter.

Dette er selvfølgelig en meget enkel måde at gøre det på at ramme jorden med nogle indledende testbrugere under udviklingen - ikke som du skal håndtere data i produktionen.

Vi vil lytte til kontekstopdateringshændelsen:

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

Den aktuelle implementering her betyder ikke rigtig noget - og afhænger generelt af den persistensløsning, du bruger. Hovedpointen er - vi vedvarer de myndigheder, vi bruger i koden.

7. UserDetailsService

Vores implementering af UserDetailsService er hvor myndighedskortlægningen finder sted. Når brugeren har godkendt, vores getAuthorities () metoden udfyldes og returnerer a UserDetails objekt:

privat samling getAuthorities (indsamlingsroller) {Liste autoriteter = ny ArrayList (); for (Rolle rolle: roller) {autoriteter.add (ny SimpleGrantedAuthority (role.getName ())); role.getPrivileges (). stream () .map (p -> ny SimpleGrantedAuthority (p.getName ())) .forEach (autoriteter :: tilføj); } returneringsmyndigheder }

8. Kørsel og test af eksemplet

Vi kan udføre eksemplet RollerAuthoritiesApplication Java-applikation, der findes i GitHub-projektet.

For at se den rollebaserede autorisation i aktion skal vi:

  • Adgang // localhost: 8082 / protectedbyrole
  • Godkend som [e-mail beskyttet] (adgangskode er "bruger")
  • Bemærk vellykket godkendelse
  • Adgang // localhost: 8082 / protectedbyauthority
  • Bemærk mislykket godkendelse

For at se autoritetsbaseret autorisation i aktion skal vi logge ud af applikationen og derefter:

  • Adgang // localhost: 8082 / protectedbyauthority
  • Godkend som [email protected] / admin
  • Bemærk vellykket godkendelse
  • Adgang // localhsot: 8082 / protectedbyrole
  • Bemærk mislykket godkendelse

9. Konklusion

I denne hurtige vejledning så vi på den subtile, men signifikante forskel mellem a Rolle og en Bevilget autoritet i forårssikkerhed.