Spring Security - Authentification par exécution

Spring Security - Authentification par exécution

1. Vue d'ensemble

Dans ce didacticiel, nous allons illustrer comment utiliser l'authentification Run-As dans Spring Security avec un scénario simple.

L'explication de très haut niveau concernant Run-As est la suivante: un utilisateur peut exécuter une partie de la logique en tant qu'autre principal avec des privilèges différents.

2. LesRunAsManager

La première chose à faire est de configurer nosGlobalMethodSecurity et d’injecter unRunAsManager.

Ceci est responsable de fournir à l'objet temporaireAuthentication des privilèges supplémentaires:

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

En remplaçantrunAsManager, nous remplaçons l'implémentation par défaut dans la classe de base - qui renvoie simplement unnull.

Notez également la propriétékey - le framework l'utilise pour sécuriser / vérifier les objets temporairesAuthentication (créés via ce gestionnaire).

Enfin - l'objetAuthentication résultant est unRunAsUserToken. __

3. Configuration de sécurité

Pour authentifier notre objet temporaireAuthentication, nous allons configurer unRunAsImplAuthenticationProvider:

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

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

Nous configurons bien sûr cela avec la même clé que nous avons utilisée dans le gestionnaire - afin que le fournisseur puisse vérifier que l'objet d'authentificationRunAsUserToken est créé à l'aide de la même clé.

4. Le contrôleur avec@Secured

Voyons maintenant comment utiliser le remplacement de l'authentification Run-As:

@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();
    }

}

L'élément central ici est le nouveau rôle -RUN_AS_REPORTER. Ceci est le déclencheur de la fonctionnalité Run-As - car la structure la traite différemment en raison du préfixe.

Lorsqu'une requête s'exécute via cette logique, nous aurons:

  • Les droits d’utilisateur actuels avant la méthodetryRunAs() sont [ROLE_USER]

  • Les droits utilisateur actuels dans la méthodetryRunAs() sont [ROLE_USER, ROLE_RUN_AS_REPORTER]

  • L'objet temporaireAuthentication remplace l'objet d'authentification existant pendant la durée de l'appel de la méthodetryRunAS() uniquement

5. Le service

Enfin, mettons en œuvre la logique réelle - une couche de service simple qui est également sécurisée:

@Service
public class RunAsService {

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

Notez que:

  • Pour accéder à la méthodegetCurrentUser(), nous avons besoin deROLE_RUN_AS_REPORTER

  • Nous ne pouvons donc appeler la méthodegetCurrentUser() que dans notre méthode contrôleurtryRunAs()

6. Le Front-End

Ensuite, nous allons utiliser un simple frontal pour tester notre fonctionnalité Run-As:



Current user authorities:
    user

Generate Report As Super User

Alors maintenant, lorsqu'un utilisateur déclenche l'action «Generate Report As Super User», il obtiendra l'autorité temporaireROLE_RUN_AS_REPORTER.

7. Conclusion

Dans ce rapide tutoriel, nous avons exploré un exemple simple utilisant la fonctionnalité Spring SecurityRun-As authentication replacement.

Ce tutoriel est basé sur lescodebase available on GitHub.