प्रस्तावना: वसंत-सुरक्षा 3.2 के बाद @AuthenticationPrincipal
से इस उत्तर के अंत में वर्णित एक अच्छा एनोटेशन है । जब आप स्प्रिंग-सिक्योरिटी> = 3.2 का उपयोग करते हैं तो यह सबसे अच्छा तरीका है।
जब आप:
- वसंत-सुरक्षा के पुराने संस्करण का उपयोग करें,
- प्रिंसिपल या में संग्रहीत कुछ जानकारी (जैसे लॉगिन या आईडी) द्वारा अपने कस्टम उपयोगकर्ता ऑब्जेक्ट को डेटाबेस से लोड करने की आवश्यकता है
- कैसे एक सीखना चाहते हैं
HandlerMethodArgumentResolver
या WebArgumentResolver
एक सुरुचिपूर्ण तरीके से इस हल कर सकते हैं, या सिर्फ एक के पीछे की पृष्ठभूमि सीखना चाहते हैं @AuthenticationPrincipal
और AuthenticationPrincipalArgumentResolver
(क्योंकि यह एक पर आधारित है HandlerMethodArgumentResolver
)
फिर पढ़ते रहें - अन्यथा बस उपयोग करें @AuthenticationPrincipal
और रोब विंच (लेखक @AuthenticationPrincipal
) और लुकास श्मेलज़ेसेन (उनके उत्तर के लिए ) को धन्यवाद दें ।
(बीटीडब्ल्यू: मेरा उत्तर थोड़ा पुराना है (जनवरी 2012), इसलिए यह लुकास श्मेलज़ेसेन था जो @AuthenticationPrincipal
स्प्रिंग सिक्योरिटी 3.2 पर एनोटेशन सॉल्यूशन बेस के साथ पहले के रूप में आया ।)
फिर आप अपने कंट्रोलर में उपयोग कर सकते हैं
public ModelAndView someRequestHandler(Principal principal) {
User activeUser = (User) ((Authentication) principal).getPrincipal();
...
}
अगर एक बार जरूरत हो तो ठीक है। लेकिन अगर आपको कई बार इसकी बदसूरत ज़रूरत होती है, क्योंकि यह आपके नियंत्रक को बुनियादी ढांचे के विवरण के साथ प्रदूषित करता है, जो सामान्य रूप से रूपरेखा द्वारा छिपा होना चाहिए।
तो क्या आप वास्तव में चाहते हैं कि इस तरह एक नियंत्रक हो सकता है:
public ModelAndView someRequestHandler(@ActiveUser User activeUser) {
...
}
इसलिए आपको केवल एक को लागू करने की आवश्यकता है WebArgumentResolver
। इसकी एक विधि है
Object resolveArgument(MethodParameter methodParameter,
NativeWebRequest webRequest)
throws Exception
वेब अनुरोध (दूसरा पैरामीटर) प्राप्त करता है और User
यदि विधि तर्क (पहला पैरामीटर) के लिए जिम्मेदार महसूस करता है तो उसे वापस करना होगा ।
स्प्रिंग 3.1 के बाद से एक नई अवधारणा है HandlerMethodArgumentResolver
। यदि आप स्प्रिंग 3.1+ का उपयोग करते हैं तो आपको इसका उपयोग करना चाहिए। (यह इस उत्तर के अगले भाग में वर्णित है)
public class CurrentUserWebArgumentResolver implements WebArgumentResolver{
Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {
if(methodParameter is for type User && methodParameter is annotated with @ActiveUser) {
Principal principal = webRequest.getUserPrincipal();
return (User) ((Authentication) principal).getPrincipal();
} else {
return WebArgumentResolver.UNRESOLVED;
}
}
}
आपको कस्टम एनोटेशन को परिभाषित करने की आवश्यकता है - आप इसे छोड़ सकते हैं यदि उपयोगकर्ता के प्रत्येक उदाहरण को हमेशा सुरक्षा संदर्भ से लिया जाना चाहिए, लेकिन कभी भी कमांड ऑब्जेक्ट नहीं है।
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ActiveUser {}
कॉन्फ़िगरेशन में आपको केवल इसे जोड़ना होगा:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
id="applicationConversionService">
<property name="customArgumentResolver">
<bean class="CurrentUserWebArgumentResolver"/>
</property>
</bean>
@See: स्प्रिंग MVC @Controller विधि तर्कों को अनुकूलित करना सीखें
यह ध्यान दिया जाना चाहिए कि यदि आप स्प्रिंग 3.1 का उपयोग कर रहे हैं, तो वे WebArgumentResolver पर HandlerMethodArgumentResolver की सलाह देते हैं। - जय द्वारा टिप्पणी देखें
HandlerMethodArgumentResolver
स्प्रिंग 3.1+ के साथ भी ऐसा ही है
public class CurrentUserHandlerMethodArgumentResolver
implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return
methodParameter.getParameterAnnotation(ActiveUser.class) != null
&& methodParameter.getParameterType().equals(User.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
if (this.supportsParameter(methodParameter)) {
Principal principal = webRequest.getUserPrincipal();
return (User) ((Authentication) principal).getPrincipal();
} else {
return WebArgumentResolver.UNRESOLVED;
}
}
}
कॉन्फ़िगरेशन में, आपको इसे जोड़ने की आवश्यकता है
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="CurrentUserHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
@ एसई लीवरिंग स्प्रिंग एमवीसी 3.1 हैंडलरमैथोडऑर्गगुएशनओलवर इंटरफ़ेस
वसंत-सुरक्षा 3.2 समाधान
स्प्रिंग सिक्योरिटी 3.2 (स्प्रिंग 3.2 के साथ भ्रमित न करें) समाधान में स्वयं का निर्माण है: @AuthenticationPrincipal
( org.springframework.security.web.bind.annotation.AuthenticationPrincipal
)। यह लुकास शमेलज़ेसेन के उत्तर में अच्छी तरह से वर्णित है
यह सिर्फ लिख रहा है
ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {
...
}
इस कार्य को प्राप्त करने के लिए आपको AuthenticationPrincipalArgumentResolver
( org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver
): "एक्टीवेटिंग" @EnableWebMvcSecurity
करके या इस बीन को भीतर रजिस्टर करके रजिस्टर करने की आवश्यकता है mvc:argument-resolvers
- उसी तरह जैसा मैंने ऊपर स्प्रिंग 3.1 समाधान के साथ वर्णित किया है।
@See स्प्रिंग सुरक्षा 3.2 संदर्भ, अध्याय 11.2। @AuthenticationPrincipal
वसंत-सुरक्षा 4.0 समाधान
यह स्प्रिंग 3.2 समाधान की तरह काम करता है, लेकिन स्प्रिंग 4.0 में @AuthenticationPrincipal
और AuthenticationPrincipalArgumentResolver
दूसरे पैकेज में "ले जाया गया":
(लेकिन इसके पुराने पैक्स में पुरानी कक्षाएं अभी भी मौजूद हैं, इसलिए उन्हें मिलाएं नहीं!)
यह सिर्फ लिख रहा है
import org.springframework.security.core.annotation.AuthenticationPrincipal;
ModelAndView someRequestHandler(@AuthenticationPrincipal User activeUser) {
...
}
इस कार्य को करने के लिए आपको रजिस्टर ( org.springframework.security.web.method.annotation.
) AuthenticationPrincipalArgumentResolver
: "एक्टीवेटिंग" @EnableWebMvcSecurity
करके या इस बीन को रजिस्टर करके भीतर लाने की आवश्यकता है mvc:argument-resolvers
- उसी तरह जैसा मैंने ऊपर स्प्रिंग 3.1 समाधान के साथ वर्णित किया है।
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
@See स्प्रिंग सिक्योरिटी 5.0 संदर्भ, अध्याय 39.3 @AuthenticationPrincipal