2012-09-17 29 views

Respuesta

12

Encontré una solución razonable basada en la respuesta de @ luke-taylor.

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

Esto me devolvió el usuario principal y no la aplicación de identificación del cliente – BigDong

+1

Versión actualizada: 'auth.getOAuth2Request(). GetClientId()' – Cataclysm

15

La identidad del cliente está disponible en el objeto Authentication al que puede enviar el principal o directamente desde el contexto de seguridad local del subproceso. Algo así como

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

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

Si no quiere poner ese código directamente en el controlador, se puede aplicar un descriptor de acceso contexto separado como se describe en this answer e inyectar eso en su lugar.

+0

buena respuesta, excepto la fecha es poco viejo. El arranque de primavera 1.3.3 está utilizando getOAuth2Request() en lugar de getAuthorizationRequest() – tao

3

Concretar la opción HandlerMethodArgumentResolver un poco más. Con el fin de apoyar la siguiente:

@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 
} 

necesitaremos la HandlerMethodArgumentResolver registrado en nuestro contexto de aplicación (para mí esto estaba dentro de un WebMvcConfigurerAdapter). Mi HandlerMethodArgumentResolver se parece a esto:

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; 
    } 

} 

Y la definición @interface:

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

} 
Cuestiones relacionadas