16

Từ quản trị viên, tôi thấy rằng bạn có thể cấp quyền cho người dùng hoặc nhóm người dùng: cho phép thêm, thay đổi hoặc xóa dữ liệu từ mô hình.Django - quyền người dùng đối với một số chế độ xem nhất định?

Điều đó thật tuyệt, nhưng tôi cũng cần cho phép người dùng hoặc nhóm người dùng truy cập hoặc không phải là nhóm lượt xem. Tôi có một số loại dịch vụ nhất định trên trang web của mình vì vậy tôi muốn cho phép một số người dùng truy cập vào một số dịch vụ nhất định (trang/lượt xem) nhưng không cho phép những người khác.

Vậy làm cách nào tôi có thể cho phép một số người dùng/nhóm người dùng nhất định truy cập vào các chế độ xem nhất định? Cảm ơn bạn!

Trả lời

22

Người dùng không thể thêm hoặc thay đổi vv một mô hình nhất định, sẽ không thể nhìn thấy nó trong quản trị viên.

Nếu chúng ta đang nói về chế độ xem được tạo tùy chỉnh của bạn thì bạn có thể tạo nội dung nào đó kiểm tra người dùng để xin phép và trả về 404 nếu họ không có quyền đó. Quyền được liên kết với các mô hình và một nhóm có thể được gán các quyền khác nhau.

Bạn có thể thêm một phép một mô hình như thế này:

# myproject/myapp/models.py 

class MyModel(models.Model): 
    class Meta: 
     permissions = (
      ('permission_code', 'Friendly permission description'), 
     ) 

Sau đó, bạn có thể kiểm tra một nếu người dùng có quyền như thế này:

@user_passes_test(lambda u: u.has_perm('myapp.permission_code')) 
def some_view(request): 
    # ... 

Sử dụng điều khoản bạn có thể sau đó dễ dàng thêm hoặc xóa chúng khỏi người dùng và nhóm chỉ đơn giản bằng cách sử dụng giao diện quản trị.

+0

Vâng, tôi đang đề cập đến chế độ xem tùy chỉnh mà tôi đã tạo không phải là quản trị viên. – avatar

+0

Cảm ơn bạn. Tôi sẽ thử. Trông tương đối dễ. – avatar

+0

@permission_required sẽ dễ dàng hơn và thanh lịch hơn ở đây – Manur

9

Bạn cần quản lý thủ công, nhưng nó khá dễ dàng. Có lẽ có một thuộc tính xác định xem một nhóm có quyền xem chế độ xem hay không: khi đó bạn chỉ cần trang trí chế độ xem đó với trang trí permission_required, nếu đó là câu hỏi đơn giản về việc người dùng có Giấy phép cụ thể hay user_passes_test. phức tạp hơn:

@user_passes_test(lambda u: u.is_allowed_to_see_view_myview()) 
def myview(request): 
    ...etc... 

giả định rằng is_allowed_to_see_view_myview là một loại phương pháp nào đó trên đối tượng Người dùng.

authentication docs khá toàn diện.

1

Hệ thống quyền là mô hình tập trung và giả định rằng quyền được gắn với mô hình. Tôi nghĩ rằng sau 2 lựa chọn thay thế là lựa chọn tốt nhất:

A. Nếu quan điểm của bạn liên quan đến một số mô hình cụ thể, hãy sử dụng quyền tùy chỉnh trên mô hình đó như Marcus Whybrow được đề xuất.

B. [chưa được kiểm tra, có thể không hoạt động] Các lớp con User và xác định quyền của bạn ở đó. Bạn không cần phải mô hình thực tế, nó chỉ bao bọc cho phép tùy chỉnh của ứng dụng của bạn:

from django.contrib.auth.models import User 
class MyUser(User): 
    class Meta: 
     permissions = (('can_visit_$viewset1', 'Can visit $view_set_1')) 

Đừng quên để chạy syncdb để thêm quyền tùy chỉnh cơ sở dữ liệu.

+0

Kể từ Django 1.3, không có cách nào để phân lớp người dùng (ngoài việc sử dụng AUTH_PROFILE_MODULE, nhưng điều đó không giúp ích gì ở đây). – SystemParadox

1

Đối với quan điểm giai cấp dựa bạn có thể kế thừa UserPassesTestMixin lớp thành quan điểm và xác định test_func

from django.contrib.auth.mixins import UserPassesTestMixin 

class MainView(UserPassesTestMixin, View): 

    def test_func(self): 
     return self.request.user.has_perm('app.get_main_view') 

Hãy xem this docs để biết thêm chi tiết về cách sử dụng này:

+0

Thông tin quan trọng, đó là tính năng khá gần đây của django (phiên bản 1.9+) – Drachenfels

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