2012-09-17 21 views

risposta

12

Ho trovato una soluzione ragionevole basata sulla risposta @ luke-taylor.

@RequestMapping(method = GET) 
public List<Place> read(OAuth2Authentication auth) { 
    auth.getOAuth2Request().getClientId() 
} 
+0

Questo mi ha restituito l'utente principale e non l'applicazione id client – BigDong

+1

Versione aggiornata: 'auth.getOAuth2Request(). GetClientId()' – Cataclysm

15

L'identità del client è disponibile dall'oggetto Authentication a cui è possibile eseguire il cast dell'entità oppure ottenere direttamente dal contesto di sicurezza del thread locale. Qualcosa di simile

Authentication a = SecurityContextHolder.getContext().getAuthentication(); 

String clientId = ((OAuth2Authentication) a).getAuthorizationRequest().getClientId(); 

Se non si desidera inserire il codice direttamente nel controller, è possibile implementare una funzione di accesso contesto separato come descritto nel this answer e iniettare che in esso, invece.

+0

risposta bello, tranne la data post è po 'vecchio. Il boot spring 1.3.3 utilizza getOAuth2Request() invece di getAuthorizationRequest() – tao

3

Completare un po 'l'opzione HandlerMethodArgumentResolver. Al fine di supportare i seguenti:

@RequestMapping(
    value = WEB_HOOKS, 
    method = RequestMethod.GET, 
    produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseStatus(HttpStatus.OK) 
public List<SomeDTO> getThoseDTOs(@CurrentClientId String clientId) 
{ 
    // Do something with clientId - it will be null if there was no authentication 
} 

avremo bisogno del HandlerMethodArgumentResolver registrato con il nostro contesto di applicazione (per me questo è stato all'interno di un WebMvcConfigurerAdapter). Il mio HandlerMethodArgumentResolver assomiglia a questo:

public class OAuth2ClientIdArgumentResolver implements HandlerMethodArgumentResolver { 

    @Override 
    public boolean supportsParameter(MethodParameter parameter) { 
     return parameter.getParameterAnnotation(CurrentClientId.class) != null 
       && parameter.getParameterType().equals(String.class); 
    } 

    @Override 
    public Object resolveArgument(
      MethodParameter parameter, 
      ModelAndViewContainer mavContainer, 
      NativeWebRequest webRequest, 
      WebDataBinderFactory binderFactory) 
     throws Exception 
    { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     if(authentication == null) { 
      return null; 
     } 
     String clientId = null; 

     if (authentication.getClass().isAssignableFrom(OAuth2Authentication.class)) { 
      clientId = ((OAuth2Authentication) authentication).getOAuth2Request().getClientId(); 
     } 

     return clientId; 
    } 

} 

E la definizione @interface:

@Target({ElementType.PARAMETER, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
public @interface CurrentClientId { 

}