2012-08-04 16 views
9

प्रमाणीकरण और प्राधिकरण कुप्पी के लॉग इन और कुप्पी के प्रधान प्लगइन्स के माध्यम से बोतल में एकीकृत किया जा सकता है। (या भी कुप्पी के सुरक्षा प्लगइन के माध्यम से संभावित रूप से।)कुप्पी के व्यवस्थापक + (कुप्पी के लॉग इन और/या कुप्पी के प्रधान)

हालांकि: कुप्पी के व्यवस्थापक जो एक बैकएंड डैशबोर्ड प्रदान करता है --another प्लगइन - नहीं एक पंजीकृत खाका है ... और, मेरा मानना ​​है कि (मैं के रूप में इस कदर बता सकते हैं), फ्लास्क-लॉगिन और फ्लास्क-प्रिंसिपल द्वारा उपयोग किए जाने वाले सजावटी - और अन्यथा किसी उपयोगकर्ता के लिए एक प्रस्तुत दृश्य तक पहुंचने के लिए आवश्यक है ... वे सजावटी केवल उन दृश्यों पर काम करते हैं जो एक पंजीकृत ब्लूप्रिंट का हिस्सा हैं।

दो सवाल:

1) मैं अपने अनुप्रयोग में एक खाका के रूप में कुप्पी के व्यवस्थापक रजिस्टर कैसे करते हैं, और/या अन्यथा कुप्पी के लॉग इन और/या कुप्पी के प्रधान सज्जाकार कुप्पी के व्यवस्थापक के साथ जुड़े विचारों की रक्षा के लिए सक्षम ?

2) फ्लास्क-लॉगिन और फ्लास्क-प्रिंसिपल केवल उन वस्तुओं पर क्यों काम करते हैं जो मेरे ऐप का "मूल रूप से" हिस्सा हैं ... और ऑब्जेक्ट्स (उदा।, "व्यवस्थापक" ऑब्जेक्ट) जो प्लगइन से आयात नहीं किया जाता है? मैं इस समस्या के आसपास कैसे काम कर सकता हूं ... अगर वास्तव में मैं इसे सही ढंग से समझ रहा हूं?

मैं इकट्ठा करता हूं यह समस्या बहुत अधिक है क्योंकि मेरे ऐप के मुख्य इंडेक्स पेज ... या ब्लूप्रिंट के अंदर स्थित किसी अन्य पृष्ठ के लिए सुरक्षित दृश्य बनाने के लिए मेरे लिए कोई पसीना नहीं है। मैं बस फ्लास्क-एडमिन इंडेक्स पेज के लिए ऐसा नहीं कर सकता (जो, फिर से, कोई ब्लूप्रिंट नहीं है)।

उत्तर

11

कुप्पी के व्यवस्थापक प्रमाणीकरण प्रदान करने का एक और तरीका प्रदान करता है - (यदि आप केवल उन जरूरत contrib से या विचार) आप बस AdminIndex और BaseIndex विचारों उपवर्ग और is_accessible विधि को लागू। अधिक जानकारी के लिए the documentation देखें। भंडार में an example भी प्रदान किया गया है।

+0

धन्यवाद, शॉन के साथ कुप्पी के व्यवस्थापक का उपयोग कैसे करें ... इस एक के लिए डॉक्स पर मुझे बदलने के लिए। मैंने उनकी समीक्षा की है, और उन्हें लागू करने का प्रयास किया ... हालांकि कोई फायदा नहीं हुआ। Is_accessible विधि का उपयोग तब व्यवस्थापक डैशबोर्ड की सुरक्षा के लिए Flask-Login का उपयोग करने के लिए अनावश्यक बनाता है? मतलब: तो मुझे किसी भी फ्लास्क-एडमिन व्यू के डीफ़ के लिए फ्लास्क-लॉगिन सजावट की आवश्यकता नहीं है? मुझे कहना है, रेपो के बाहर, फ्लास्क-एडमिन के साथ दस्तावेज़ों के लिए दस्तावेज़ पतले हैं। यदि, उपरोक्त रेपो से परे, मौके से, आप उस समाधान के एक और सार्वजनिक कार्यान्वयन में आते हैं ... इसके बारे में जानना अच्छा लगेगा। – Sean

+1

@ सेन - आपको फ्लास्क-लॉगिन * सजावट * की आवश्यकता नहीं है लेकिन आपको उपयोगकर्ता को प्रमाणीकृत करने के लिए फ्लास्क-लॉगिन विधियों का उपयोग करने की आवश्यकता होगी। यदि आप [लाइन 85] (https://github.com/mrjoes/flask-admin/blob/master/examples/auth/auth.py#L85) देखते हैं और उदाहरण के बाहर आप देखेंगे कि व्यवस्थापक विचार वर्तमान उपयोगकर्ता प्रमाणीकृत होने पर ही पहुंच योग्य है। यदि एक गैर-प्रमाणीकृत उपयोगकर्ता व्यवस्थापक दृश्यों तक पहुंचने का प्रयास करता है तो उन्हें लॉगिन स्क्रीन पर रीडायरेक्ट किया जाना चाहिए। –

+0

एक उदाहरण का लिंक बिल्कुल वही था जो मुझे चाहिए, धन्यवाद। – iurii

4

सरल उदाहरण कुप्पी के प्रधान

from functools import partial 
from flask.ext.admin import Admin as BaseAdmin, AdminIndexView 
from flask.ext.principal import Permission, identity_loaded, Need 
from flask.ext.security import current_user 

PartnerAccessNeed = partial(Need, 'access') 

class PartnerAccessPermission(Permission): 
    def __init__(self, partner_id): 
     need = PartnerAccessNeed(partner_id) 
     super(PartnerAccessPermission, self).__init__(need) 


@identity_loaded.connect 
def on_post_identity_loaded(sender, identity): 
    if hasattr(current_user, 'partner'): 
     identity.provides.add(PartnerAccessNeed(current_user.partner.id)) 

class PartnerAdminIndexView(AdminIndexView): 

    def __init__(self, partner_id, *args, **kwargs): 
     self.partner_id = partner_id 
     super(PartnerAdminIndexView, self).__init__(*args, **kwargs) 

    def is_accessible(self): 

     if current_user.is_anonymous(): 
      return redirect(url_for_security('login')) 

     if not current_user.is_partner(): 
      return False 

     permission = PartnerAccessPermission(self.partner_id) 

     if permission.can():  
      return True 

     return False 

class PartnerAdmin(BaseAdmin): 
    def __init__(self, partner_id, endpoint, name, subdomain, *args, **kwargs): 

     index = PartnerAdminIndexView(name=name, 
             endpoint=endpoint, 
             url='/dashboard', 
             partner_id=partner_id) 

     super(PartnerAdmin, self).__init__(base_template='mcnm/master.html', index_view=index, subdomain=subdomain) 
+1

'is_accessible' में रीडायरेक्ट लौटने पर सत्य के रूप में मूल्यांकन किया जाता है। यह निश्चित रूप से आप नहीं चाहते हैं! – Javier

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