2017-08-16 3 views
0

Nous avons donc un serveur d'autorisation avec lequel nous créons un jeton d'accès OAuth2. Tous les sous-systèmes vérifient le jeton d'accès et peuvent vérifier le chemin de la demande pour les autorisations, cependant, dans l'un des sous-systèmes, nous devons examiner le corps de la requête et extraire l'identifiant pour vérifier si l'utilisateur a l'autorisation la demande. Le message de demande est au format JSON et il s'agit d'une demande POST avec l'ID fourni par le client.Comment accéder au corps de la requête dans AccessDecisionVoter de SpringBoot?

L'identificateur de la demande est un identificateur de processus et certains utilisateurs peuvent ne pas avoir l'autorisation correcte sur certains processus. Nous devons donc vérifier l'identificateur.

Donc, alors que dans AccessDecisionVoter, nous ne pouvons obtenir l'URI de la demande mais je ne peux pas obtenir HttpServletRequest pour lire le message. (Note: Nous avons un wrapper de demande qui nous permet de lire le corps de la demande plusieurs fois)

J'ai essayé d'auto-fil HttpServletRequest, pas de chance. Il y a une erreur qu'aucun thread n'a été lié à la requête

Je pensais aussi à implémenter UserDetailService mais encore une fois pas de chance car cela n'est pas invoqué par Spring boot. Rappelez-vous que nous utilisons un AuthorizationServerTokenServices personnalisé et que c'est dans une bibliothèque commune.

Comment obtenir une requête Http de servlet ou le corps de la demande dans AccessDecisionVoter?

Répondre

0

Vous devriez être en mesure d'implémenter un AccessDecisionVoter<FilterInvocation> où vous pouvez obtenir la demande. Cela ne fonctionne-t-il pas:

public class MyAccessDecisionVoter implements AccessDecisionVoter<FilterInvocation> { 
    @Override 
    public boolean supports(ConfigAttribute attribute) { 
     return false; 
    } 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return true; 
    } 

    @Override 
    public int vote(Authentication authentication, FilterInvocation fi, Collection<ConfigAttribute> attributes) { 
     int result = ACCESS_ABSTAIN; 
     fi.getRequest() // this is the request 
     // decide the outcome and set result 

     return result; 
    } 
} 
+0

Merci! Donc la question est, est-ce le bon endroit pour le faire? En termes de bonnes pratiques? – xbmono

+0

Voilà à quoi servent les électeurs de la décision: D – Strelok