1. 程式人生 > >Django2.0-驗證和授權(4)-許可權

Django2.0-驗證和授權(4)-許可權

許可權

Django中內建了許可權的功能。

  • 都是針對表(模型級別)的。比如對某個模型上的資料是否可以進行增刪改查操作。
  • 不能針對資料級別的,比如對某個表中的某條資料能否進行增刪改查操作(如果要實現資料級別的,考慮使用django-guardian)。

建立完一個模型後,針對這個模型預設就有三種許可權,分別是增/刪/改。

在執行完migrate命令後,檢視資料庫中的auth_permission表中的所有許可權。

其中的codename表示的是許可權的名字。name表示的是這個許可權的作用。content_type_id指向django_content_type

表,該表示表示models對應的app


新增許可權

通過定義模型新增許可權

如果想要增加新的許可權,比如檢視某個模型的許可權,那麼可以在定義模型的時候在Meta中定義好。

class DemoModel(models.Model):
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=20, validators=[validators.MinLengthValidator(6)])

    class Meta:
        permissions =
{ ("search_demo", "can search demo"), }

通過程式碼新增許可權

許可權都是django.contrib.auth.Permission的例項。

這個模型包含三個欄位,namecodename以及content_type,其中的content_type表示這個permission是屬於哪個app下的哪個models

from django.contrib.auth.models import Permission, ContentType
from .models import DemoModel


def
create_permission(request): content_type = ContentType.objects.get_for_model(DemoModel) permission = Permission.objects.create(codename='edit_demo', name='can edit demo', content_type=content_type) return HttpResponse("create_permission successful")

使用者與許可權管理

許可權本身只是一個數據,必須和使用者進行繫結,才能起到作用。
User模型和許可權之間的管理,可以通過以下幾種方式來管理(MyUser指的是預設有的User模型或者是自定義的模型):

  1. MyUser.user_permissions.set(permission_list):直接給定一個許可權的列表。
  2. MyUser.user_permissions.add(permission,permission,...):一個個新增許可權。
  3. MyUser.user_permissions.remove(permission,permission,...):一個個刪除許可權。
  4. MyUser.user_permissions.clear():清除許可權。
  5. MyUser.has_perm('<app_name>.<codename>'):判斷是否擁有某個許可權。許可權引數是一個字串,格式是app_name.codename。判斷user.permissions下有沒有這個許可權:有, 返回True;沒有 判斷所屬組下有沒有這個許可權.
  6. MyUser.get_all_permissons():獲取所有的許可權。
def operate_permission(request):
    content_type = ContentType.objects.get_for_model(DemoModel)
    permissions = Permission.objects.filter(content_type=content_type)
    for permission in permissions:
        print(permission)

    user = InheritTwo.objects.filter().first()
    # user.user_permissions.set(permissions)
    
    # user.user_permissions.clear()
    
    # user.user_permissions.add(permissions[0])
    # user.user_permissions.add(*permissions)
    
    # user.user_permissions.remove(permissions[1])
    # user.user_permissions.remove(*permissions)
    
    if user.has_perm('front.search_demo'):  # 如果是user.has_perms,則引數是一個列表
        print("yes")
    else:
        print("no")
        
    return HttpResponse("successful")

許可權限定裝飾器

使用django.contrib.auth.decorators.permission_required可以非常方便的檢查使用者是否擁有這個許可權,

  1. 如果擁有,那麼就可以進入到指定的檢視函式中,
  2. 如果不擁有,那麼就會報一個403錯誤。
from django.contrib.auth.decorators import permission_required


#@permission_required(["front.search_demo",])
# @permission_required("front.search_demo")  # 預設訪問http://127.0.0.1:8000/accounts/login/?next=/search/
# @permission_required("front.search_demo", login_url='/login/')  #如果驗證失敗,則跳轉login_url指定的url路徑
@ permission_required("front.search_demo", login_url='/login/', raise_exception=True)  # 即使驗證成功後,如果沒有許可權,則跳轉403
def search_demo(request):
    # 類似以下操作
    # if request.user.is_authenticated:
    #     print("已經登陸")
    #     if request.user.has_perm('front.search_demo'):
    #         return HttpResponse("這是查詢demo的介面")
    #     else:
    #         return HttpResponse("你沒有許可權訪問該頁面的許可權")
    # else:
    #     return redirect(reverse('login'))
    return HttpResponse("這是查詢demo的介面")  # 如果驗證成功且有許可權