21

このスニペットでは:

@RequestMapping(method = GET)
public List<Place> read(Principal principal) {
  principal.getName(); 
}

principal.getName()ユーザーIDを教えてくれますが、クライアントの資格情報を受け取る方法が必要です(client => APIを使用しているアプリ)。これどうやってするの?

4

6 に答える 6

24

クライアント ID はAuthentication、プリンシパルをキャストするか、スレッドローカル セキュリティ コンテキストから直接取得できるオブジェクトから取得できます。何かのようなもの

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

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

そのコードをコントローラーに直接入れたくない場合は、この回答で説明されているように別のコンテキストアクセサーを実装し、代わりにそれを挿入できます。

于 2012-09-18T12:38:53.440 に答える
16

@luke-taylorの回答に基づいて合理的な解決策を見つけました。

@RequestMapping(method = GET)
public List<Place> read(OAuth2Authentication auth) {
  auth.getOAuth2Request().getClientId()
}
于 2012-09-26T19:12:17.220 に答える
5

HandlerMethodArgumentResolverオプションをもう少し具体化します。以下をサポートするため:

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

HandlerMethodArgumentResolverApplication Contextに登録された が必要です(私にとっては、これは a 内にありましたWebMvcConfigurerAdapter)。私HandlerMethodArgumentResolverはこのように見えます:

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

}

そして@interface定義:

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

}
于 2015-02-02T18:57:26.287 に答える