Spring Security - Run-As-Authentifizierung

Spring Security - Run-As-Authentifizierung

1. Überblick

In diesem Lernprogramm wird anhand eines einfachen Szenarios veranschaulicht, wie die Run-As-Authentifizierung in Spring Security verwendet wird.

Die allgemeine Erklärung zu Run-As lautet wie folgt: Ein Benutzer kann eine Logik als ein anderes Prinzipal mit unterschiedlichen Berechtigungen ausführen.

2. DieRunAsManager

Das erste, was wir tun müssen, ist, unsereGlobalMethodSecurity einzurichten und einRunAsManager zu injizieren.

Dies ist dafür verantwortlich, dass das temporäreAuthentication-Objekt zusätzliche Berechtigungen erhält:

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected RunAsManager runAsManager() {
        RunAsManagerImpl runAsManager = new RunAsManagerImpl();
        runAsManager.setKey("MyRunAsKey");
        return runAsManager;
    }
}

Durch Überschreiben vonrunAsManager ersetzen wir die Standardimplementierung in der Basisklasse, die einfachnull zurückgibt.

Beachten Sie auch die Eigenschaftkey- das Framework verwendet diese, um temporäreAuthentication-Objekte (die über diesen Manager erstellt wurden) zu sichern / zu überprüfen.

Schließlich ist das resultierendeAuthentication-Objekt einRunAsUserToken. __

3. Sicherheitskonfiguration

Um unser temporäresAuthentication-Objekt zu authentifizieren, richten wir einRunAsImplAuthenticationProvider ein:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    ...
    auth.authenticationProvider(runAsAuthenticationProvider());
}

@Bean
public AuthenticationProvider runAsAuthenticationProvider() {
    RunAsImplAuthenticationProvider authProvider = new RunAsImplAuthenticationProvider();
    authProvider.setKey("MyRunAsKey");
    return authProvider;
}

Wir richten dies natürlich mit demselben Schlüssel ein, den wir im Manager verwendet haben, damit der Anbieter überprüfen kann, ob das Authentifizierungsobjekt vonRunAsUserTokenmit demselben Schlüssel erstellt wurde.

4. Der Controller mit@Secured

Nun sehen wir uns an, wie der Ersatz für die Run-As-Authentifizierung verwendet wird:

@Controller
@RequestMapping("/runas")
class RunAsController {

    @Secured({ "ROLE_USER", "RUN_AS_REPORTER" })
    @RequestMapping
    @ResponseBody
    public String tryRunAs() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        return "Current User Authorities inside this RunAS method only " +
          auth.getAuthorities().toString();
    }

}

Das Kernstück hier ist die neue Rolle -RUN_AS_REPORTER. Dies ist der Auslöser der Run-As-Funktionalität, da das Framework aufgrund des Präfixes anders damit umgeht.

Wenn eine Anforderung über diese Logik ausgeführt wird, haben wir:

  • Die aktuellen Benutzerberechtigungen vor der Methode vontryRunAs()ind [ROLE_USER].

  • Die aktuellen Benutzerberechtigungen innerhalb der Methode vontryRunAs()ind [ROLE_USER, ROLE_RUN_AS_REPORTER].

  • Das temporäreAuthentication-Objekt ersetzt das vorhandene Authentifizierungsobjekt nur für die Dauer des Methodenaufrufs vontryRunAS()

5. Der Service

Lassen Sie uns abschließend die eigentliche Logik implementieren - eine einfache Service-Schicht, die auch gesichert ist:

@Service
public class RunAsService {

    @Secured({ "ROLE_RUN_AS_REPORTER" })
    public Authentication getCurrentUser() {
        Authentication authentication =
          SecurityContextHolder.getContext().getAuthentication();
        return authentication;
    }
}

Beachten Sie, dass:

  • Um auf die MethodegetCurrentUser() zugreifen zu können, müssen wirROLE_RUN_AS_REPORTER verwenden

  • Daher können wir die MethodegetCurrentUser()nur innerhalb unserer Controller-MethodetryRunAs()aufrufen

6. Das Frontend

Als nächstes werden wir ein einfaches Frontend verwenden, um unsere Run-As-Funktion zu testen:



Current user authorities:
    user

Generate Report As Super User

Wenn ein Benutzer nun die Aktion "Generate Report As Super User" auslöst, erhält er die temporäre Berechtigung "ROLE_RUN_AS_REPORTER".

7. Fazit

In diesem kurzen Tutorial haben wir ein einfaches Beispiel mit der Funktion Spring SecurityRun-As authentication replacementuntersucht.

Dieses Tutorial basiert aufcodebase available on GitHub.