2017-10-04 1 views
0

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.

+0

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

Répondre

0

Je pense que la meilleure solution serait de changer cette URL. Si la déclaration est aussi explicite. Il y a aussi des intercepteurs que vous pouvez utiliser, mais je ne les vois pas comme étant très différents de l'utilisation des aspects, des choses plutôt diaboliques. Mais si vous utilisez des aspects, je suggérerais que vous ayez une annotation telle que @Me avec laquelle vous pourriez annoter des entrées de méthode telles que userId, qui les remplacerait par l'identifiant du principal si le paramètre est égal à moi.