Nous avons un groupe de services Web sécurisés (en utilisant la sécurité à ressort) définis comme ceci:Être connecté userId d'un « moi » id relative/users/me botte printemps api
@GetMapping("https://stackoverflow.com/users/{userId}")
public User getUserInfo(@PathVariable String userId) {
...
@GetMapping("https://stackoverflow.com/users/{userId}/addresses")
public User getUserInfo(@PathVariable String userId) {
Si je veux obtenir l'utilisateur connecté, je peux ajouter le Principal principal
ou HttpServletRequest request
à la méthode et le printemps soutiendra les données pour l'utilisateur connecté, ou aussi je peux utiliser SecurityContextHolder.getContext().getAuthentication()
. Jusqu'ici tout va bien, si nous voulons obtenir l'utilisateur connecté pour l'API /users/1234
nous n'avons aucun problème. Cependant, nous avons une exigence pour prendre en charge une valeur relative userId étant me
où l'API serait /users/me
.
Nous pourrions résoudre ce problème en ajoutant dans chaque API une simple instruction if
et en remplaçant l'ID utilisateur me
par l'ID utilisateur réel connecté. Nous n'aimons pas cette implémentation puisque nous avons un code standard dans 20 API. Donc, une autre solution que nous avons essayée était d'ajouter un aspect pour remplacer le me
par le vrai userId mais je n'aime pas utiliser la réflexion pour résoudre ce problème. Alors, je me demandais s'il y avait un moyen de "démarrage de printemps" de faire cela? Je n'ai trouvé aucune fonctionnalité supportant ce comportement.
Je recommanderais de l'implémenter comme une nouvelle méthode, car dans la plupart des cas, vous ne pouvez pas faire les mêmes opérations vous-même et un utilisateur différent. Par exemple, vous pouvez changer votre propre utilisateur, mais pas changer d'autres utilisateurs. – dur