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.