एक GrantedAuthority "अनुमति" या एक "अधिकार" होने के रूप में सोचो। उन "अनुमतियों" को (सामान्य रूप से) स्ट्रिंग्स ( getAuthority()
विधि के साथ) के रूप में व्यक्त किया जाता है । वे तार आपको अनुमतियों की पहचान करने और अपने मतदाताओं को यह तय करने देते हैं कि क्या वे किसी चीज़ तक पहुंच प्रदान करते हैं
आप उपयोगकर्ताओं को सुरक्षा संदर्भ में डालकर विभिन्न GrantedAuthority (अनुमतियाँ) प्रदान कर सकते हैं। आप सामान्य रूप से अपने खुद के UserDetailsService को लागू करके करते हैं, जो आवश्यक GrantedAuthorities को लौटाता है एक UserDetails कार्यान्वयन देता है।
भूमिकाएं (जैसा कि वे कई उदाहरणों में उपयोग की जाती हैं) एक नामकरण सम्मेलन के साथ सिर्फ "अनुमति" हैं जो कहती हैं कि एक भूमिका एक GrantedAuthority है जो उपसर्ग के साथ शुरू होती है ROLE_
। ज्यादा कुछ नहीं है। एक भूमिका सिर्फ एक GrantedAuthority है - एक "अनुमति" - एक "सही"। आप वसंत सुरक्षा में बहुत सारे स्थान देखते हैं, जहां इसके ROLE_
उपसर्ग के साथ भूमिका विशेष रूप से भूमिका में निभाई जाती है जैसे कि रोलवॉटर में, जहां ROLE_
उपसर्ग का उपयोग डिफ़ॉल्ट के रूप में किया जाता है। यह आपको ROLE_
उपसर्गों से भूमिका नाम प्रदान करने की अनुमति देता है । वसंत सुरक्षा 4 से पहले, "भूमिकाओं" की इस विशेष हैंडलिंग का लगातार पालन नहीं किया गया है और अधिकारियों और भूमिकाओं को अक्सर एक ही माना जाता है (जैसा कि आप चाहें)hasAuthority()
hasRole()
)। स्प्रिंग सिक्योरिटी 4 के साथ, भूमिकाओं का उपचार अधिक सुसंगत और कोड है जो "भूमिकाओं" (जैसे RoleVoter
, hasRole
अभिव्यक्ति आदि) से संबंधित है, हमेशा ROLE_
आपके लिए उपसर्ग जोड़ता है । तो hasAuthority('ROLE_ADMIN')
इसका मतलब वही है hasRole('ADMIN')
क्योंकि ROLE_
उपसर्ग अपने आप जुड़ जाता है। भविष्य की जानकारी के लिए वसंत सुरक्षा 3 से 4 माइग्रेशन गाइड देखें।
लेकिन फिर भी: एक भूमिका एक विशेष ROLE_
उपसर्ग के साथ एक प्राधिकरण है । तो वसंत सुरक्षा में 3 के @PreAuthorize("hasRole('ROLE_XYZ')")
रूप में ही है @PreAuthorize("hasAuthority('ROLE_XYZ')")
और वसंत सुरक्षा में 4 के @PreAuthorize("hasRole('XYZ')")
रूप में ही है @PreAuthorize("hasAuthority('ROLE_XYZ')")
।
आपके उपयोग के मामले के बारे में:
उपयोगकर्ताओं के पास भूमिकाएं हैं और भूमिकाएं कुछ संचालन कर सकती हैं।
आप GrantedAuthorities
उन भूमिकाओं के लिए समाप्त हो सकते हैं, जो उपयोगकर्ता किसी भूमिका से संबंधित हैं और भूमिकाएं निभा सकती हैं। GrantedAuthorities
भूमिकाओं के लिए उपसर्ग ROLE_
और संचालन उपसर्ग OP_
। एक उदाहरण आपरेशन अधिकारियों हो सकता है के लिए OP_DELETE_ACCOUNT
, OP_CREATE_USER
, OP_RUN_BATCH_JOB
आदि भूमिकाओं हो सकता है ROLE_ADMIN
, ROLE_USER
, ROLE_OWNER
आदि
आप अपनी संस्थाओं GrantedAuthority
को इस तरह लागू कर सकते हैं (छद्म-कोड) उदाहरण:
@Entity
class Role implements GrantedAuthority {
@Id
private String id;
@ManyToMany
private final List<Operation> allowedOperations = new ArrayList<>();
@Override
public String getAuthority() {
return id;
}
public Collection<GrantedAuthority> getAllowedOperations() {
return allowedOperations;
}
}
@Entity
class User {
@Id
private String id;
@ManyToMany
private final List<Role> roles = new ArrayList<>();
public Collection<Role> getRoles() {
return roles;
}
}
@Entity
class Operation implements GrantedAuthority {
@Id
private String id;
@Override
public String getAuthority() {
return id;
}
}
आपके डेटाबेस में आपके द्वारा बनाई गई भूमिकाओं और संचालन की आईडी, GrantedAuthority प्रतिनिधित्व, उदाहरण के लिए ROLE_ADMIN
, OP_DELETE_ACCOUNT
आदि होगी। जब कोई उपयोगकर्ता प्रमाणित होता है, तो सुनिश्चित करें कि उसके सभी भूमिकाओं के सभी GrantedAuthorities और संबंधित संचालन UserDetails.getAuthorities () से वापस कर दिए जाते हैं। तरीका।
उदाहरण: आईडी के साथ व्यवस्थापक भूमिका ROLE_ADMIN
कार्य किया है OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
, OP_RUN_BATCH_JOB
यह करने के लिए सौंपा। आईडी के साथ उपयोगकर्ता की भूमिका ROLE_USER
का संचालन होता है OP_READ_ACCOUNT
।
जिसके परिणामस्वरूप सुरक्षा के संदर्भ में एक व्यवस्थापक लॉग GrantedAuthorities होगा:
ROLE_ADMIN
, OP_DELETE_ACCOUNT
, OP_READ_ACCOUNT
,OP_RUN_BATCH_JOB
एक उपयोगकर्ता यह लॉग करता है, यह करना होगा:
ROLE_USER
,OP_READ_ACCOUNT
UserDetailsService उन भूमिकाओं के सभी भूमिकाओं और सभी कार्यों को एकत्र करने और उन्हें लौटाए गए UserDetails उदाहरण में विधि getAuthorities () द्वारा उपलब्ध कराने का ध्यान रखेगा।