Gewährte Autorität versus Rolle in der Frühlingssicherheit

1. Übersicht

In diesem kurzen Artikel erklären wir den subtilen, aber signifikanten Unterschied zwischen einer Rolle und einer gewährten Autorität in Spring Security . Weitere Informationen zu Rollen und Berechtigungen finden Sie im Artikel hier.

2. GrantedAuthority

In Spring Security können wir uns jede GrantedAuthority als individuelles Privileg vorstellen . Beispiele könnten READ_AUTHORITY , WRITE_PRIVILEGE oder sogar CAN_EXECUTE_AS_ROOT sein . Es ist wichtig zu verstehen, dass der Name beliebig ist .

Wenn Sie eine GrantedAuthority direkt verwenden, z. B. durch die Verwendung eines Ausdrucks wie hasAuthority ('READ_AUTHORITY'), beschränken wir den Zugriff auf feinkörnige Weise .

Wie Sie wahrscheinlich feststellen können, können wir uns auch mit Privilegien auf das Konzept der Autorität beziehen .

3. Rolle als Autorität

In ähnlicher Weise in Spring Security, können wir jeder denken Rolle als ein grobkörniges GrantedAuthority , die als dargestellt wird String und mit dem Präfix „ ROLLE . Wenn Sie eine Rolle direkt verwenden, z. B. durch einen Ausdruck wie hasRole („ADMIN“) , beschränken wir den Zugriff grobkörnig.

Es ist erwähnenswert, dass das Standardpräfix „ ROLE“ konfigurierbar ist. Die Erläuterung der Vorgehensweise würde jedoch den Rahmen dieses Artikels sprengen .

Der Hauptunterschied zwischen diesen beiden ist die Semantik, die wir der Verwendung der Funktion beimessen. Für das Framework ist der Unterschied minimal - und es geht grundsätzlich genauso damit um.

4. Rolle als Container

Jetzt, wo wir haben gesehen , wie das Framework die verwendete Rolle Konzept, lassen Sie sich auch schnell eine Alternative diskutieren - und das ist mit Rollen als Container von Behörden / Privilegien .

Dies ist ein übergeordneter Ansatz für Rollen, der sie eher zu einem geschäftsorientierten als zu einem implementierungsorientierten Konzept macht.

Das Spring Security-Framework gibt keine Anleitung, wie wir das Konzept verwenden sollten, daher ist die Auswahl vollständig implementierungsspezifisch.

5. Spring Security-Konfiguration

Wir können eine detaillierte Autorisierungsanforderung nachweisen, indem wir den Zugriff auf / protectedbyauthority auf Benutzer mit READ_AUTHORITY beschränken .

Wir können eine grobkörnige Autorisierungsanforderung nachweisen, indem wir den Zugriff auf / protectedbyrole auf Benutzer mit ROLE_USER beschränken .

Lassen Sie uns ein solches Szenario in unserer Sicherheitskonfiguration konfigurieren:

@Override protected void configure(HttpSecurity http) throws Exception { // ... .antMatchers("/protectedbyrole").hasRole("USER") .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE") // ... }

6. Einfache Dateninit

Nachdem wir die Kernkonzepte besser verstanden haben, wollen wir beim Starten der Anwendung einige Setup-Daten erstellen.

Dies ist natürlich eine sehr einfache Möglichkeit, um mit einigen vorläufigen Testbenutzern während der Entwicklung den ersten Schritt zu machen - nicht so, wie Sie mit Daten in der Produktion umgehen sollten.

Wir werden auf das Kontextaktualisierungsereignis warten:

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

Die tatsächliche Implementierung spielt hier keine Rolle - und hängt im Allgemeinen von der verwendeten Persistenzlösung ab. Der Hauptpunkt ist - wir behalten die Autoritäten bei, die wir im Code verwenden.

7. UserDetailsService

In unserer Implementierung von UserDetailsService findet die Berechtigungszuordnung statt . Sobald sich der Benutzer authentifiziert hat, füllt unsere Methode getAuthorities () ein UserDetails- Objekt und gibt es zurück :

private Collection getAuthorities( Collection roles) { List authorities = new ArrayList(); for (Role role: roles) { authorities.add(new SimpleGrantedAuthority(role.getName())); role.getPrivileges().stream() .map(p -> new SimpleGrantedAuthority(p.getName())) .forEach(authorities::add); } return authorities; }

8. Ausführen und Testen des Beispiels

Wir können die Java- Beispielanwendung RolesAuthoritiesApplication ausführen , die im GitHub-Projekt enthalten ist.

Um die rollenbasierte Autorisierung in Aktion zu sehen, müssen wir:

  • Zugriff // localhost: 8082 / protectedbyrole
  • Authentifizieren Sie sich als [E-Mail geschützt] (Passwort ist "Benutzer" )
  • Beachten Sie die erfolgreiche Autorisierung
  • Zugriff // localhost: 8082 / protectedbyauthority
  • Beachten Sie die nicht erfolgreiche Autorisierung

Um die autorisierungsbasierte Autorisierung in Aktion zu sehen, müssen wir uns von der Anwendung abmelden und dann:

  • Zugriff // localhost: 8082 / protectedbyauthority
  • Authentifizieren Sie sich als [E-Mail geschützt] / admin
  • Beachten Sie die erfolgreiche Autorisierung
  • Zugriff // localhsot: 8082 / protectedbyrole
  • Beachten Sie die nicht erfolgreiche Autorisierung

9. Fazit

In diesem kurzen Tutorial haben wir uns den subtilen, aber signifikanten Unterschied zwischen einer Rolle und einer GrantedAuthority in Spring Security angesehen.