2009-08-13 13 views
6

मुझे पता नहीं लगाया जा सकता है कि अनुमति की आवश्यकता सजावट क्यों काम नहीं कर रही है। मैं केवल कर्मचारियों के सदस्यों के लिए एक दृश्य तक पहुंच की अनुमति देना चाहता हूं। मैंअनुमति_रेक्वायर सजावटी मेरे लिए काम नहीं कर रहा है

@permission_required('request.user.is_staff',login_url="../admin") 
def series_info(request): 
    ... 

और भी

@permission_required('user.is_staff',login_url="../admin") 
def series_info(request): 
    ... 

सुपर उपयोगकर्ता के रूप में की कोशिश की है, मैं दृश्य का उपयोग कर सकते हैं, लेकिन किसी भी उन मैं कर्मचारियों के रूप में बनाने के लिए इसे का उपयोग नहीं कर सकते हैं और प्रवेश यूआरएल पृष्ठ पर पुनः निर्देशित कर रहे हैं। मैंने login_required सजावट का परीक्षण किया और यह ठीक काम करता है।

उत्तर

22

permission_required() एक स्ट्रिंग में पायथन अभिव्यक्ति नहीं, एक अनुमति नाम पारित किया जाना चाहिए। ऐसा करें:

from contrib.auth.decorators import user_passes_test 
def staff_required(login_url=None): 
    return user_passes_test(lambda u: u.is_staff, login_url=login_url) 

@staff_required(login_url="../admin") 
def series_info(request) 
... 

धन्यवाद। यह काम करता है। क्या आपके पास अनुमति_क्रॉक्ड का उपयोग करने का उदाहरण है? से docs.djangoproject.com/en/1.0/... और djangobook.com/en/2.0/chapter14 I सोचा कि मुझे क्या करना चाहिए था।

आपके द्वारा पोस्ट किए गए लिंक को दोबारा पढ़ें; permission_required() परीक्षण करेगा यदि उपयोगकर्ता को एक विशेष अनुमति दी गई है। यह उपयोगकर्ता ऑब्जेक्ट के गुणों का परीक्षण नहीं करता है।

http://www.djangobook.com/en/2.0/chapter14/ से:

def vote(request): 
    if request.user.is_authenticated() and request.user.has_perm('polls.can_vote')): 
     # vote here 
    else: 
     return HttpResponse("You can't vote in this poll.") 

    # 
    # 
# # # 
    ### 
    # 

def user_can_vote(user): 
    return user.is_authenticated() and user.has_perm("polls.can_vote") 

@user_passes_test(user_can_vote, login_url="/login/") 
def vote(request): 
    # vote here 

    # 
    # 
# # # 
    ### 
    # 

from django.contrib.auth.decorators import permission_required 

@permission_required('polls.can_vote', login_url="/login/") 
def vote(request): 
    # vote here 
+0

धन्यवाद। यह काम करता है। क्या आपके पास perm_required का उपयोग करने का उदाहरण है? प्रलेखन से http://docs.djangoproject.com/en/1.0/topics/auth/#the-permission-required-decorator और http://www.djangobook.com/en/2.0/chapter14/ मैंने सोचा कि मैं क्या काम करना चाहिए था। – Mitch

+0

आह। समझा। दृढ़ता के लिए धन्यवाद। – Mitch

+2

क्या आप कृपया समझा सकते हैं कि अंत में ** 'poll.can_vote' ** पैरामीटर के साथ क्या हो रहा है? इसका उद्देश्य क्या है और इसका संदर्भ कहां है? क्या यह शायद समूह का नाम है, एक सदस्य होना चाहिए? –

1

यहाँ व्यवहार का एक उदाहरण मुझे समझ नहीं आता है। मैं एक उपयोगकर्ता बनाता हूं, अनुरोध करता हूं और 'is_staff' के लिए अनुमति_required जांच के साथ एक परीक्षण समारोह सजाने के लिए। यदि उपयोगकर्ता सुपरसियर है, तो परीक्षण फ़ंक्शन पर पहुंच प्रदान की जाती है। यदि उपयोगकर्ता में केवल is_staff = सही है, तो पहुंच प्रदान नहीं की जाती है।

from django.contrib.admin.views.decorators import staff_member_required 

@staff_member_required 
def series_info(request): 
    ... 

प्रलेखन कहते हैं staff_member_required के बारे में:

from django.http import HttpRequest 
from django.contrib.auth.models import User 
from django.contrib.auth.decorators import permission_required 

@permission_required('is_staff') 
def test(dummy='dummy'): 
    print 'In test' 

mb_user = User.objects.create_user('mitch', '[email protected]', 'mbpassword') 
mb_user.is_staff = True 

req = HttpRequest() 
req.user = mb_user 

test(req) # access to test denied - redirected 

req.user.is_staff = False 

test(req) # same as when is_staff is True 

req.user.is_superuser = True 
test(req) # access to test allowed 
+1

is_staff उपयोगकर्ता ऑब्जेक्ट की विशेषता है, अनुमति नहीं है। 'Django> = 1.9' के लिए –

3

यह मैं इसे कैसे करना होगा है की जाँच करता है कि कि उपयोगकर्ता के प्रवेश और एक स्टाफ सदस्य है विचारों के लिए

डेकोरेटर , यदि आवश्यक हो तो लॉगिन पेज प्रदर्शित करना।

0

वैसे, आप वर्ग आधारित विचारों उपयोग कर रहे हैं, तो आप अपने डेकोरेटर method_decorator डेकोरेटर में लपेट करना चाहिए (आंकड़ा जाना):

class MyView(DetailView): 
    ... 
    @method_decorator(permission_required('polls.can_vote', login_url=reverse_lazy('my_login'))) 
    def dispatch(self, request, *args, **kwargs): 
     .... blah .... 

class MyModel(models.Model): 
    ... 
    def has_perm(self perm, obj=None): 
     if perm == 'polls.canvote': 
      return self.can_vote() 
+1

'क्लास आधारित व्यू' के साथ आप [PermissionRequiredMixin] (https://docs.djangoproject.com/en/dev/topics/auth/default/#the-permissionrequiredmixin-mixin) का उपयोग कर सकते हैं। –

0

यह मेरा 'परियोजना' पर मेरे लिए काम करता तालिका/मॉडल:

@permission_required('myApp.add_project') 
def create(request): 
    # python code etc... 

जाहिर add_ [जो कुछ भी अपने मॉडल/तालिका है] को add_project बदल जाते हैं। इसे संपादित करने के लिए:

@permission_required ('myApp।edit_project ')

और नष्ट करने के लिए:

@permission_required (' myApp.delete_project ')

लेकिन मैंने पाया कि मुख्य बात सुनिश्चित करें कि आपके प्रमाणन टेबल सही ढंग से स्थापित कर रहे हैं बनाने के लिए है। यही कारण है कि मुझे समस्याएं हुईं। यदि आप समूह का उपयोग कर रहे हैं तो अनुमतियों की जांच करने के लिए मैंने एक MySQL SQL क्वेरी लिखा है। यह सबसे डीबीएस में काम करना चाहिए:

select usr.id as 'user id',usr.username,grp.id as 'group id',grp.name as 'group name',grpu.id as 'auth_user_groups',grpp.id as 'auth_group_permissions',perm.name,perm.codename 
from auth_user usr 
left join auth_user_groups grpu on usr.id = grpu.user_id 
left join auth_group grp on grpu.group_id = grp.id 
left join auth_group_permissions grpp on grp.id = grpp.group_id 
left join auth_permission perm on grpp.permission_id = perm.id 
order by usr.id; 

मैंने पाया कि मेरी अनुमतियाँ ठीक से सेट नहीं किया गया है, और यह भी django_content_type तालिका जो ऐड, संपादित से प्रत्येक के लिए प्रत्येक अनुप्रयोग और मेज के लिए पंक्तियों होना आवश्यक है के लिए बाहर देखने के लिए, हटाना । तो अगर आप एक परियोजना तालिका है आप django_content_type में यह देखना चाहिए:

id   [generated by dB] 
app_label myApp 
model  project 

आप मुसीबत एक और अच्छा विचार करने के लिए सक्षम और Django व्यवस्थापक ऐप्स का उपयोग करना है कर रहे हैं। यह आपको दिखाएगा कि आपकी समस्याएं कहां हैं, और कुछ परीक्षण अनुमतियां सेट करके, उपयोगकर्ता और समूह, फिर आप ऊपर चर्चा की गई तालिकाओं की जांच कर सकते हैं ताकि यह देखने के लिए कि क्या किया जा रहा है। यह आपको एक अच्छा विचार देगा कि ऑथ अनुमतियाँ कैसे काम करती हैं।

मैं इसे लिखने के लिए कुछ घंटे खर्च करने से बचाने के लिए लिख सकता हूं जो मैंने किया था!

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