अधिकांश उत्तर कुछ बिंदुओं को याद कर रहे हैं:
भूमिका और अधिकार स्प्रिंग में समान नहीं हैं। अधिक जानकारी के लिए यहां देखें ।
भूमिका नाम rolePrefix+ के बराबर हैं authority।
डिफ़ॉल्ट भूमिका उपसर्ग है ROLE_, हालांकि, यह विन्यास योग्य है। देखें यहाँ ।
इसलिए, यदि यह कॉन्फ़िगर किया गया है, तो भूमिका की उपसर्ग का सम्मान करने के लिए एक उचित भूमिका की जांच की आवश्यकता है।
दुर्भाग्य से, स्प्रिंग में भूमिका उपसर्ग अनुकूलन थोड़ा सा है, कई स्थानों पर डिफ़ॉल्ट उपसर्ग, ROLE_हार्डकोड किया गया है, लेकिन इसके अलावा, GrantedAuthorityDefaultsवसंत संदर्भ में एक प्रकार की बीन की जाँच की जाती है, और यदि यह मौजूद है, तो कस्टम भूमिका इसके उपसर्ग है। सम्मान किया गया है।
इन सभी जानकारियों को एक साथ लाते हुए, एक बेहतर भूमिका परीक्षक कार्यान्वयन कुछ इस तरह होगा:
@Component
public class RoleChecker {
@Autowired(required = false)
private GrantedAuthorityDefaults grantedAuthorityDefaults;
public boolean hasRole(String role) {
String rolePrefix = grantedAuthorityDefaults != null ? grantedAuthorityDefaults.getRolePrefix() : "ROLE_";
return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(Authentication::getAuthorities)
.map(Collection::stream)
.orElse(Stream.empty())
.map(GrantedAuthority::getAuthority)
.map(authority -> rolePrefix + authority)
.anyMatch(role::equals);
}
}
SecurityContextHolderAwareRequestWrapperउदाहरण की आवश्यकता है । आप इसे समझा सकते हैं कि इसे कैसे प्राप्त किया जाए और उत्तर को थोड़ा और स्पष्ट किया जाए।