প্রস্তাবনামূলক: স্প্রিং-সুরক্ষা ৩.২ যেহেতু @AuthenticationPrincipalএই উত্তরের শেষে বর্ণিত একটি দুর্দান্ত টীকা রয়েছে । আপনি যখন বসন্ত-সুরক্ষা> = 3.2 ব্যবহার করেন তখন যাওয়ার সর্বোত্তম উপায়।
যখন তুমি:
- বসন্ত-সুরক্ষার একটি পুরানো সংস্করণ ব্যবহার করুন,
- অধ্যক্ষ বা সঞ্চিত কিছু তথ্য (যেমন লগইন বা আইডি) দ্বারা ডেটাবেস থেকে আপনার কাস্টম ব্যবহারকারী অবজেক্টটি লোড করা দরকার
- কীভাবে একটি
HandlerMethodArgumentResolverবা WebArgumentResolverএটি একটি মার্জিত উপায়ে সমাধান করতে পারে তা শিখতে চাই বা পিছনের পটভূমিটি শিখতে চাই @AuthenticationPrincipalএবং AuthenticationPrincipalArgumentResolver(কারণ এটি একটি এর উপর ভিত্তি করে HandlerMethodArgumentResolver)
তারপরে পড়া চালিয়ে যান - অন্যথায় কেবল @AuthenticationPrincipalরব উইঞ্চ (লেখক @AuthenticationPrincipal) এবং লুকাশ শামেলজিয়েসেন (তার উত্তরের জন্য ) ব্যবহার করুন এবং ধন্যবাদ ।
(বিটিডাব্লু: আমার উত্তরটি কিছুটা পুরনো (জানুয়ারী ২০১২), সুতরাং স্প্রিং সিকিউরিটি ৩.২- এ এনটোটেশন সলিউশনের ভিত্তিতে লুকাশ শামেলজেইসেনই প্রথম এসেছিলেন @AuthenticationPrincipal)
তারপরে আপনি আপনার নিয়ামকটি ব্যবহার করতে পারেন
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যদি পদ্ধতি আর্গুমেন্ট (প্রথম প্যারামিটার) এর জন্য দায়বদ্ধ মনে করে তবে তা অবশ্যই ফিরিয়ে আনতে হবে ।
স্প্রিং ৩.১ থেকে একটি নতুন ধারণা বলা হয় HandlerMethodArgumentResolver। আপনি যদি স্প্রিং ৩.১+ ব্যবহার করেন তবে আপনার এটি ব্যবহার করা উচিত। (এটি এই উত্তরের পরবর্তী অংশে বর্ণিত হয়েছে))
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>
@ দেখুন: স্প্রিং এমভিসি @ নিয়ন্ত্রণকারী পদ্ধতি যুক্তিগুলি কাস্টমাইজ করতে শিখুন
এটি লক্ষণীয় হওয়া উচিত যে আপনি যদি স্প্রিং ৩.১ ব্যবহার করেন তবে তারা ওয়েবআরগমেন্ট রিসোলভারের উপর হ্যান্ডলারমেথডআর্গমেন্ট রিসোলভারের পরামর্শ দেয়। - জে মন্তব্য দেখুন
HandlerMethodArgumentResolverস্প্রিং ৩.১+ এর জন্য একই
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.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 সমাধানের সাথে এটি বর্ণনা করেছি।
@ স্প্রিং সুরক্ষা দেখুন ৩.২ তথ্যসূত্র, অধ্যায় ১১.২। @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>
@ স্প্রিং সুরক্ষা 5.0 রেফারেন্স দেখুন, অধ্যায় 39.3 @ প্রমাণীকরণের মূলসূত্র