2011-06-15 13 views
62

मैं अनुमतियों के साथ भूमिका-आधारित सुरक्षा स्थापित करने की कोशिश कर रहा हूं। मैं वसंत-सुरक्षा के साथ इसे एक साथ करने की कोशिश कर रहा हूं।भूमिकाओं और अनुमतियों के साथ वसंत सुरक्षा

मैं एसीएल सेट अप नहीं करना चाहता क्योंकि ऐसा लगता है कि यह मेरी आवश्यकताओं के लिए एक ओवरकिल है।

मैं इस article में वर्णित सरल अनुमतियां और भूमिकाएं चाहता हूं। दुर्भाग्य से लेख वर्णन नहीं करता है कि दिए गए समाधान को कैसे कार्यान्वित किया जाए।

क्या किसी ने पहले ही यह कोशिश की है और मुझे सही दिशा में इंगित कर सकता है? शायद एक और ब्लॉग प्रविष्टि है जो कार्यान्वयन का वर्णन करती है?

बहुत बहुत धन्यवाद।

+12

में, वहाँ एक लेख जो वास्तव में मेरी समस्या का हल है। कृपया [इस] (http://slackspace.de/articles/roles-permissions-with-spring-security-3/) – flash

+0

पर एक नज़र डालें, मैंने उस लेख को पढ़ा और मैं इसे लागू करने की कोशिश कर रहा हूं। क्या आप कृपया मुझे बताएंगे कि आपने SpringSecurityDaoImpl क्लास को कैसे कार्यान्वित किया? @PreAuthorize मेरे यूआरएल को बिल्कुल प्रभावित नहीं करता है! मैंने बिल्कुल उस लेख में सामग्री की तरह किया है। – sina

+0

@sina आपको 'SpringSecurityDaoImpl' को लागू करने की आवश्यकता नहीं है, उदाहरण के लिए बस 'JdbcDaoImpl' को बढ़ाएं। गिटूब पर उदाहरण कोड को देखना सुनिश्चित करें, जिसे लेख में संदर्भित किया गया है। – flash

उत्तर

24

कि लागू करने के लिए, ऐसा लगता है कि आप करने के लिए है कि:

  1. अपने मॉडल (उपयोगकर्ता, भूमिका, अनुमतियाँ) और किसी दिए गए उपयोगकर्ता के लिए अनुमतियाँ पुनः प्राप्त करने के लिए एक रास्ता बनाने के लिए;
  2. अपना खुद का org.springframework.security.authentication.ProviderManager परिभाषित करें और इसे कॉन्फ़िगर करें (अपने प्रदाताओं को सेट करें) को कस्टम org.springframework.security.authentication.AuthenticationProvider पर कॉन्फ़िगर करें। यह अंतिम व्यक्ति अपनी प्रमाणीकरण विधि को प्रमाणीकरण पर वापस लौटना चाहिए, जिसे आपके मामले में org.springframework.security.core.GrantedAuthority के साथ सेट किया जाना चाहिए, दिए गए उपयोगकर्ता के लिए सभी अनुमतियां।

कि लेख में चाल उपयोगकर्ताओं को सौंपा भूमिका है, लेकिन, Authentication.authorities वस्तु में उन भूमिकाओं के लिए अनुमति सेट करने के लिए है।

इसके लिए मैं आपको एपीआई पढ़ने की सलाह देता हूं, और देखता हूं कि आप सब कुछ लागू करने के बजाय कुछ बुनियादी प्रदाता प्रबंधक और प्रमाणीकरणप्रदाता का विस्तार कर सकते हैं या नहीं। मैंने org.springframework.security.ldap.authentication.LdapAuthenticationProvider के साथ एक कस्टम LdapAuthoritiesPopulator सेट किया है, जो उपयोगकर्ता के लिए सही भूमिकाएं पुनर्प्राप्त करेगा।

आशा है कि इस बार मुझे वह मिल गया जो आप खोज रहे हैं। शुभकामनाएँ।

+0

इसे एक दाओ प्रमाणीकरणप्रदाता प्रदान करें और इसे एक कस्टम UserDetailsService दें, जो अनुमतियों को लोड करना चाहिए। – embf

5

बुनियादी कदम हैं:

  1. <bean id="myAuthenticationProvider" class="myProviderImplementation" scope="singleton"> 
    ... 
    </bean> 
    

  2. एक कस्टम प्रमाणीकरण प्रदाता का उपयोग करें अपने कस्टम प्रदाता एक कस्टम UserDetails कार्यान्वयन वापसी सुनिश्चित करें। यह UserDetailsImpl एक getAuthorities() इस तरह होगा:

    public Collection<GrantedAuthority> getAuthorities() { 
        List<GrantedAuthority> permissions = new ArrayList<GrantedAuthority>(); 
        for (GrantedAuthority role: roles) { 
         permissions.addAll(getPermissionsIncludedInRole(role)); 
        } 
        return permissions; 
    } 
    
बेशक

यहां से आप अपनी विशिष्ट आवश्यकताओं के लिए अनुकूलन/अनुकूलन का एक बहुत लागू हो सकते हैं।

61

मैं प्रश्न में लेख के लेखक हूं।

इसमें कोई संदेह नहीं है कि ऐसा करने के कई तरीके हैं, लेकिन जिस तरह से मैं आमतौर पर ऐसा करता हूं वह कस्टम UserDetails को लागू करना है जो भूमिकाओं और अनुमतियों के बारे में जानता है। Role और Permission आपके द्वारा लिखे जाने वाले कस्टम क्लास हैं।

PERM_CREATE_POST, PERM_UPDATE_POST, PERM_READ_POST

बजाय लौटने: getAuthorities() रिटर्न GrantedAuthority वस्तुओं है कि इस तरह दिखेगा (कुछ भी नहीं fancy-- Role एक नाम और Permission उदाहरणों का एक सेट है, और Permission एक नाम है।) इसके बाद

ROLE_USER तरह बातें, ROLE_MODERATOR

भूमिकाओं अगर आपके UserDetails अभी भी उपलब्ध हैं कार्यान्वयन में getRoles() विधि है। (मैं एक होने की अनुशंसा करता हूं।)

आदर्श रूप से आप उपयोगकर्ता को भूमिका नियुक्त करते हैं और संबंधित अनुमतियां स्वचालित रूप से भर जाती हैं। इसमें कस्टम UserDetailsService शामिल होगा जो जानता है कि मैपिंग कैसे करें, और इसे केवल डेटाबेस से मैपिंग स्रोत करना है। (स्कीमा के लिए आलेख देखें।)

फिर आप भूमिकाओं के बजाय अनुमतियों के संदर्भ में अपने प्राधिकरण नियमों को परिभाषित कर सकते हैं।

उम्मीद है कि मदद करता है।

+1

हाय, क्या आप उस उत्तर में विस्तृत विवरण के रूप में कस्टम उपयोगकर्ता विवरण का व्यावहारिक समाधान प्रदान कर सकते हैं? धन्यवाद। – rayman

+0

हाय, मैंने कस्टम प्रमाणीकरणप्रदाता और उपयोगकर्ता डिस्प्ले सेवा कक्षाओं का उपयोग कर स्प्रिंग सिक्योरिटी का उपयोग करके एक एप्लिकेशन लागू किया। अब, मैं अपने आवेदन में भूमिकाओं और अनुमतियों का उपयोग करना चाहता हूं। मैं अब इसका उपयोग कर रहा हूं: ** @ सुरक्षित ("ROLE_ADMIN") **, जो केवल भूमिकाओं को नियंत्रित करता है। अनुमतियों को संभालने के लिए मैं इसे कैसे विस्तारित करता हूं। (यहां अधिक जानकारी -> http://stackoverflow.com/questions/23072619/implementation-of-roles-and-permissions-in-pring-security) –

4

यह करने का यह सबसे आसान तरीका है। समूह प्राधिकरणों के साथ-साथ उपयोगकर्ता प्राधिकरणों की अनुमति देता है।

-- Postgres syntax 

create table users (
    user_id serial primary key, 
    enabled boolean not null default true, 
    password text not null, 
    username citext not null unique 
); 

create index on users (username); 

create table groups (
    group_id serial primary key, 
    name citext not null unique 
); 

create table authorities (
    authority_id serial primary key, 
    authority citext not null unique 
); 

create table user_authorities (
    user_id int references users, 
    authority_id int references authorities, 
    primary key (user_id, authority_id) 
); 

create table group_users (
    group_id int references groups, 
    user_id int referenecs users, 
    primary key (group_id, user_id) 
); 

create table group_authorities (
    group_id int references groups, 
    authority_id int references authorities, 
    primary key (group_id, authority_id) 
); 

फिर META-INF/applicationContext-security.xml

<beans:bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="passwordEncoder" /> 

<authentication-manager> 
    <authentication-provider> 

     <jdbc-user-service 
       data-source-ref="dataSource" 

       users-by-username-query="select username, password, enabled from users where username=?" 

       authorities-by-username-query="select users.username, authorities.authority from users join user_authorities using(user_id) join authorities using(authority_id) where users.username=?" 

       group-authorities-by-username-query="select groups.id, groups.name, authorities.authority from users join group_users using(user_id) join groups using(group_id) join group_authorities using(group_id) join authorities using(authority_id) where users.username=?" 

       /> 

      <password-encoder ref="passwordEncoder" /> 

    </authentication-provider> 
</authentication-manager> 
सब जो यहाँ आने के लिए
संबंधित मुद्दे