2012-09-17 33 views
13

इस स्निपेट में:स्प्रिंग ओएथ (ओएथ 2): मैं स्प्रिंग एमवीसी नियंत्रक में क्लाइंट प्रमाण-पत्र कैसे प्राप्त कर सकता हूं?

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

principal.getName() मुझे उपयोगकर्ता की पहचान देता है, लेकिन मैं कोई तरीका होना चाहिए ग्राहक क्रेडेंशियल्स (ग्राहक => एप्लिकेशन जो मेरे एपीआई का उपयोग किया जाता है) प्राप्त करने के लिए। मैं यह कैसे कर सकता हूँ?

उत्तर

12

मुझे @ ल्यूक-टेलर उत्तर के आधार पर एक उचित समाधान मिला।

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

के बजाय GetOAuth2Request() का उपयोग कर रहा है, यह मुझे प्रिंसिपल उपयोगकर्ता लौटाया और क्लाइंट आईडी एप्लिकेशन – BigDong

+1

अद्यतन संस्करण: 'auth.getOAuth2Request()। GetClientId()' – Cataclysm

15

ग्राहक पहचान Authentication ऑब्जेक्ट से उपलब्ध है जिसे आप प्रिंसिपल को या तो थ्रेड-स्थानीय सुरक्षा संदर्भ से सीधे प्राप्त कर सकते हैं। जैसे

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

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

कुछ आपको लगता है कि कोड अपने नियंत्रक में सीधे डाल करने के लिए नहीं करना चाहते हैं, तो आपको एक अलग संदर्भ एक्सेसर this answer में वर्णित के रूप को लागू करने और बजाय इंजेक्षन है कि यह में कर सकते हैं।

+0

अच्छा जवाब को छोड़कर पद तारीख थोड़ा पुराना है: मेरी 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 परिभाषा। वसंत बूट 1.3.3 getAuthorizationRequest() – tao

3

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 हमारे ऐप्लिकेशन संदर्भ के साथ पंजीकृत की आवश्यकता होगी (मेरे लिए यह एक WebMvcConfigurerAdapter अंदर) था। ,

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

}