2009-08-13 32 views
6

Tôi không thể hiểu tại sao trang trí yêu cầu quyền được yêu cầu không hoạt động. Tôi muốn cho phép truy cập vào chế độ xem chỉ dành cho nhân viên. Tôi đã cố gắngpermission_required decorator không hoạt động đối với tôi

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

và cũng

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

Khi superuser, tôi có thể truy cập vào xem, nhưng bất kỳ người sử dụng tôi tạo như đội ngũ nhân viên không thể truy cập vào nó và được chuyển hướng đến trang url đăng nhập. Tôi đã thử nghiệm trình trang trí login_required và hoạt động tốt.

Trả lời

22

permission_required() phải được chuyển tên quyền, không phải là biểu thức Python trong chuỗi. Hãy thử điều này thay vì:

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) 
... 

Cảm ơn. Điều đó không hiệu quả. Bạn có ví dụ về về cách sử dụng quyền đối với sốkhông? Từ tài liệu docs.djangoproject.com/en/1.0/… và djangobook.com/en/2.0/chapter14 I nghĩ rằng những gì tôi đã làm việc.

Đọc lại các liên kết bạn đã đăng; permission_required() sẽ kiểm tra xem người dùng đã được cấp quyền cụ thể chưa. Nó không kiểm tra các thuộc tính của đối tượng người dùng.

Từ 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

Cảm ơn. Điều đó không hiệu quả. Bạn có ví dụ về cách sử dụng permission_required không? Từ tài liệu http://docs.djangoproject.com/en/1.0/topics/auth/#the-permission-required-decorator và http://www.djangobook.com/en/2.0/chapter14/ Tôi đã nghĩ những gì tôi đã làm việc. – Mitch

+0

Ah. Tôi hiểu rồi. Cảm ơn vì đã kiên trì. – Mitch

+2

Bạn có thể giải thích, điều gì đang xảy ra với thông số ** 'polls.can_vote' ** ở cuối? Mục đích của nó là gì và nó đề cập đến đâu? Có lẽ đó là tên của nhóm, phải là một thành viên của? –

1

Dưới đây là một ví dụ về hành vi của tôi không hiểu. Tôi tạo một người dùng, yêu cầu và trang trí một chức năng kiểm tra với permission_required kiểm tra cho 'is_staff'. Nếu người dùng là superuser, thì quyền truy cập được cấp cho hàm kiểm tra. Nếu người dùng chỉ có is_staff = True, quyền truy cập không được cấp.

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 là thuộc tính của đối tượng người dùng, không phải là quyền. –

3

Đây là cách tôi sẽ làm điều đó:

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

@staff_member_required 
def series_info(request): 
    ... 

Các tài liệu nói về staff_member_required:

Decorator cho quan điểm để kiểm tra mà người dùng đang đăng nhập và là thành viên đội ngũ nhân viên , hiển thị trang đăng nhập nếu cần.

0

Bằng cách này, nếu bạn đang sử dụng quan điểm dựa trên lớp, bạn nên bọc trang trí của bạn trong method_decorator trang trí (đi con số):

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

cho 'Django> = 1.9' bạn có thể sử dụng [PermissionRequiredMixin] (https://docs.djangoproject.com/en/dev/topics/auth/default/#the-permissionrequiredmixin-mixin) với' Chế độ xem dựa trên lớp ' –

0

này làm việc cho tôi vào 'dự án' của tôi bảng/mô hình:

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

Rõ ràng là thay đổi add_project thành tiện ích bổ sung [bất kể model/bảng của bạn]. Để chỉnh sửa nó sẽ là:

@permission_required ('myApp.edit_project ')

và xóa:

@permission_required (' myApp.delete_project ')

Nhưng tôi thấy rằng điều quan trọng là để đảm bảo bảng auth bạn được thiết lập một cách chính xác. Đây là những gì gây ra cho tôi những vấn đề. Đây là một truy vấn SQL MySQL tôi đã viết để kiểm tra các điều khoản nếu bạn đang sử dụng các nhóm. Điều này sẽ làm việc trong hầu hết các DBS:

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; 

tôi thấy rằng quyền của tôi đã không được thiết lập một cách chính xác, và cũng có thể xem ra cho bảng django_content_type mà phải có hàng cho mỗi ứng dụng và bảng cho mỗi add, chỉnh sửa, xóa . Vì vậy, nếu bạn có một bảng dự án, bạn sẽ thấy điều này trong django_content_type:

id   [generated by dB] 
app_label myApp 
model  project 

Nếu bạn gặp khó khăn, ý tưởng hay là bật và sử dụng ứng dụng quản trị django. Điều này sẽ cho bạn biết vấn đề của bạn ở đâu và bằng cách thiết lập một số quyền kiểm tra, người dùng và nhóm, bạn có thể kiểm tra các bảng được thảo luận ở trên để xem những gì đang được chèn vào ở đâu. Điều này sẽ cung cấp cho bạn ý tưởng tốt về cách hoạt động của quyền auth.

Tôi viết điều này để có thể cứu một người nào đó phải mất một vài giờ để tìm ra những gì tôi đã làm!

Các vấn đề liên quan