簡體   English   中英

Django - 某些視圖的用戶權限?

[英]Django - user permissions to certain views?

從管理員我看到您可以為用戶或用戶組分配權限以:允許從模型中添加、更改或刪除數據。

這很好,但我還需要允許用戶或用戶組訪問或不訪問一組視圖。 我的網站上有某些類型的服務,因此我希望允許某些用戶訪問某些服務(頁面/視圖),但不允許其他用戶訪問。

那么如何允許某些用戶/用戶組訪問某些視圖? 謝謝!

無法添加或更改某個模型的用戶將無法在管理中看到它。

如果我們談論的是您自定義創建的視圖,那么您可以創建一些檢查用戶權限的內容,如果他們沒有該權限,則返回 404。 權限與模型相關聯,並且可以為組分配各種權限。

您可以像這樣為模型添加權限:

# myproject/myapp/models.py

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

然后你可以檢查一個用戶是否有這樣的權限:

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

使用權限,您只需使用管理界面即可輕松地從用戶和組中添加或刪除它們。

您需要手動管理它,但這很容易。 大概有一個屬性可以確定一個組是否有權查看視圖:那么您只需使用permission_required裝飾器裝飾該視圖,如果這是用戶是否具有特定權限的簡單問題,或者user_passes_test如果它有點更復雜:

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

假設is_allowed_to_see_view_myview是 User 對象上的某種方法。

身份驗證文檔非常全面。

對於基於類的視圖,您可以將UserPassesTestMixin類繼承到視圖中並定義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')

有關如何使用它的更多詳細信息,請查看此文檔

權限系統以模型為中心,並假定權限與模型相關聯。 我認為以下兩種選擇是最佳選擇:

A. 如果您的視圖與某個特定模型相關,請按照 Marcus Whybrow 的建議對該模型使用自定義權限。

B. [未測試,可能不起作用] 子類User並在那里定義您自己的權限。 您不需要實際模型,它只是您應用程序自定義權限的包裝器:

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

不要忘記運行syncdb向數據庫添加自定義權限。

如果您使用的是 Django 1.9+,您應該能夠使用PermissionRequiredMixin

例如:

from django.contrib.auth.mixins import PermissionRequiredMixin

class MainView(PermissionRequiredMixin, View):
    permission_required = 'my_services.foo_bar'
    ...

這基本上是UserPassesTestMixin一個特例,專門用於測試用戶是否具有指定的權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM