2013-04-26 9 views
6

मैं अपने अगले वेब प्रोजेक्ट पर शिरो का उपयोग करना चाहता हूं लेकिन मुझे उपयोगकर्ताओं ([उपयोगकर्ता] shiro.ini में प्रबंधित करने के लिए एक अच्छी (यदि सबसे अच्छी नहीं है) रणनीति नहीं है)।अपाचे शिरो: आप उपयोगकर्ताओं का प्रबंधन कैसे करेंगे?

  1. क्या प्रत्येक पंजीकृत सदस्य के लिए शिरो उपयोगकर्ता बनाना सबसे अच्छा है?
  2. या फिर एक एकल शिरो उपयोगकर्ता बनाएं तो प्रत्येक सदस्य के लिए बस इसे कुछ डेटाबेस में संग्रहीत करें और उस शिरो उपयोगकर्ता के माध्यम से इसे प्राप्त करें?

यदि आप # 1 के लिए जाएंगे, तो आप इसे कैसे प्रबंधित/स्वचालित करेंगे? मैंने जिन परियोजनाओं पर काम किया, उनमें से अधिकांश # 2 के लिए चुने गए।

धन्यवाद

उत्तर

10
  1. shiro.ini में उपयोगकर्ताओं का विन्यास उत्पादन वातावरण के लिए एक अच्छा विकल्प नहीं है। इसका उपयोग केवल तभी किया जा सकता है यदि आपके पास उपयोगकर्ता खातों की एक छोटी संख्या है और आपको रनटाइम पर खाते बनाने या बदलने की आवश्यकता नहीं है। यह ज्यादातर परीक्षण के लिए प्रयोग किया जाता है।
  2. लगभग सभी परियोजनाओं के लिए सभी उपयोगकर्ता खातों को रखने के लिए कुछ संग्रहण का उपयोग करना बेहतर है। यह डेटाबेस या कुछ बाहरी प्रमाणीकरण इंजन हो सकता है, जैसे ldap, cas या even oauth।
3

आप अपने उपयोगकर्ता/समूह स्टोर के रूप में केवल Stormpath का उपयोग कर सकते हैं। Shiro integration और बूम - पूर्ण प्रबंधन UI और जावा एसडीके के साथ शिरो-सक्षम अनुप्रयोगों के लिए तत्काल उपयोगकर्ता/समूह डेटा स्टोर में ड्रॉप करें।

यह स्वचालित पासवर्ड जैसे 'पासवर्ड भूल गए' ईमेल और खाता ईमेल सत्यापन में भी मदद करता है। यह भी कई उपयोगों के लिए स्वतंत्र है। आप उदाहरण के रूप में Shiro sample app using Stormpath देख सकते हैं।

0

शिरो उपयोगकर्ताओं को कॉन्फ़िगर करने के कई तरीके प्रदान करता है। संभावित रीयल कॉन्फ़िगरेशन here पर एक नज़र डालें।

यदि इनमें से कोई भी आपकी ज़रूरतों को पूरा नहीं करता है, तो आप अपने आवेदन के लिए एक कस्टम दायरे भी लिख सकते हैं, जो कह सकता है, उपयोगकर्ता जानकारी को नोएसQL डेटाबेस से खींच सकता है, या SAML प्रतिक्रिया से जानकारी प्राप्त कर सकता है, या OAuth2 का उपयोग कर सकता है। उत्पादन में shiro.ini में कोई उपयोगकर्ता विवरण बनाने के लिए निश्चित रूप से सलाह नहीं दी जाती है। इस बात की धारणा देने के लिए कि कौन से कस्टम क्षेत्र दिख सकते हैं, यहां एक उदाहरण दिया गया है जहां मैंने एक SAML2 आधारित उपयोगकर्ता ऑथैक और ऑथज़ बनाया: shiro-saml2

0

PLease सभी के लिए केवल एक उपयोगकर्ता का उपयोग नहीं करते हैं। इस विकल्प से बचें। प्रति उपयोगकर्ता एक उपयोगकर्ता (खाता) का उपयोग करने के लिए बहुत बेहतर है।

शिरो में, आपके पास आरडीएमएस रीयलम हो सकता है जो आपको अपने उपयोगकर्ता/खाता/अनुमतियों को स्टोर करने के लिए mysql जैसे साधारण डेटाबेस का उपयोग करने की अनुमति देता है। :)

इस परियोजना को क्लोन करें, (यह मेरा नहीं है), और 1 मिनट में शुरू करें! :) shiro/mysql GIT example यह आनंद लें :)

0

Shiro अपने आवश्यकता के अनुसार अपने स्वयं के दायरे को लागू प्रदान करते हैं।

एक साधारण क्षेत्र बनाएं जिसमें आप विवरण, लॉगिन, अनुमतियां और भूमिकाएं प्रबंधित कर सकें। आप उन्हें प्रबंधित करने के लिए जेडीबीसी, हाइबरनेट, या किसी अन्य प्रमाणीकरण विधि का उपयोग कर सकते हैं।

इस क्षेत्र को अपने आईएनआई या आपके प्रोजेक्ट में जिस भी तरीके से उपयोग कर रहे हैं उसे कॉन्फ़िगर करें।

अब शिरो क्रेडेंशियल, अनुमतियों, भूमिकाओं को देखने के लिए स्वचालित रूप से आपके दायरे वर्ग के तरीकों का आह्वान करेगा।

पूर्व में मेरे पास एक शिरो हाइबरनेट क्षेत्र है, मैंने अपने डीबी में उपयोगकर्ताओं को प्रबंधित करने के लिए अपने हाइबरनेट कोड का उपयोग किया।

import java.util.Collection; 
import java.util.Date; 
import java.util.HashSet; 

import org.apache.shiro.authc.AuthenticationException; 
import org.apache.shiro.authc.AuthenticationInfo; 
import org.apache.shiro.authc.AuthenticationToken; 
import org.apache.shiro.authc.SimpleAuthenticationInfo; 
import org.apache.shiro.authc.UsernamePasswordToken; 
import org.apache.shiro.authc.credential.CredentialsMatcher; 
import org.apache.shiro.authz.AuthorizationInfo; 
import org.apache.shiro.authz.SimpleAuthorizationInfo; 
import org.apache.shiro.realm.AuthorizingRealm; 
import org.apache.shiro.subject.PrincipalCollection; 

/** 
* @author Ankit 
* 
*/ 
public class PortalHibernateRealm extends AuthorizingRealm { 

    private static final Logger LOGGER = new Logger(
      PortalHibernateRealm.class.toString()); 

    /** 
    * 
    */ 
    public PortalHibernateRealm() { 
     super(); 
     /* 
     * Set credential matcher on object creation 
     */ 
     setCredentialsMatcher(new CredentialsMatcher() { 

      @Override 
      public boolean doCredentialsMatch(AuthenticationToken arg0, 
        AuthenticationInfo arg1) { 
       UsernamePasswordToken token = (UsernamePasswordToken) arg0; 
       String username = token.getUsername(); 
       String password = new String(token.getPassword()); 
       /* 
        Check for credential and return true if found valid else false 
       */ 
       return false; 
      } 
     }); 
    } 

    @Override 
    protected AuthorizationInfo doGetAuthorizationInfo(
      PrincipalCollection principalCollection) { 
     Collection<String> permissionSet; 
     SimpleAuthorizationInfo info = null; 
     Long userId = (Long) principalCollection.getPrimaryPrincipal(); 

     //Using thi principle create SimpleAuthorizationInfo and provide permissions and roles 
      info = new SimpleAuthorizationInfo(); 

     return info; 
    } 

    @Override 
    protected AuthenticationInfo doGetAuthenticationInfo(
      AuthenticationToken authcToken) throws AuthenticationException { 
     UsernamePasswordToken token = (UsernamePasswordToken) authcToken; 

     /*using this token create a SimpleAuthenticationInfo like 
     User user = UserUtil.findByEmail(token.getUsername()); 
     */ 
     SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
       primaryPrin, Password, screenName); 

     return authenticationInfo; 
    } 

} 
संबंधित मुद्दे