このスニペットでは:
@RequestMapping(method = GET)
public List<Place> read(Principal principal) {
principal.getName();
}
principal.getName()
ユーザーIDを教えてくれますが、クライアントの資格情報を受け取る方法が必要です(client => APIを使用しているアプリ)。これどうやってするの?
このスニペットでは:
@RequestMapping(method = GET)
public List<Place> read(Principal principal) {
principal.getName();
}
principal.getName()
ユーザーIDを教えてくれますが、クライアントの資格情報を受け取る方法が必要です(client => APIを使用しているアプリ)。これどうやってするの?
クライアント ID はAuthentication
、プリンシパルをキャストするか、スレッドローカル セキュリティ コンテキストから直接取得できるオブジェクトから取得できます。何かのようなもの
Authentication a = SecurityContextHolder.getContext().getAuthentication();
String clientId = ((OAuth2Authentication) a).getAuthorizationRequest().getClientId();
そのコードをコントローラーに直接入れたくない場合は、この回答で説明されているように別のコンテキストアクセサーを実装し、代わりにそれを挿入できます。
@luke-taylorの回答に基づいて合理的な解決策を見つけました。
@RequestMapping(method = GET)
public List<Place> read(OAuth2Authentication auth) {
auth.getOAuth2Request().getClientId()
}
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
}
HandlerMethodArgumentResolver
Application 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 {
}