django权限认证

Posted Bill

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django权限认证相关的知识,希望对你有一定的参考价值。

Django权限认证系统

Django内置了强大的用户认证auth模块,系统默认使用auth_user表来存储用户数据。通过from django.contrib import auth可以导入auth模块,auth模块提供了许多函数用于认证

内置方法

  • authenticate(username=\'username\',password=\'password\'):提供了用户认证功能,即验证用户名以及密码是否正确,参数为username 和password;如果认证成功(用户名和密码正确有效),便会返回一个User对象。
  • login(Http Request, user):实现用户登录的功能,参数为HttpRequest对象和一个经过认证的User对象。如果未登录,request.user得到的是一个匿名用户对象Anonymous User对象。
  • is_authenticated():判断当前请求是否通过了认证。
  • logout(request):清除当前请求的全部session。
  • create_user():创建新用户,至少提供用户名和用户密码,形如

    user =User.objects.create_user(username=\'Tom\',password=\'test\',email=\'tom@163.com\')。
  • set_password(password):修改密码,形如user_obj.set_password(\'test\')。
  • check_password(password):检查密码是否正确,形如user_obj.check_password(\'test\')。
  • 另外还有一个login_required装饰器,通过该装饰器能够使视图函数首先判断用户是否登录。如果未登录,网页会跳转到settings.py设置的LOGIN_URL参数对应的URL
from django.contrib.auth.decorators import login_required
@login_requireddef 
index(request):

创建自定义权限的方法

  • 通过定义数据模型增加权限,在定义模型时,可以在Meta中定义权限
在执行python manage.py makemigrations和python manage.py migrate命令后,就会增加一条权限,权限的名字一般是APP_name.Permission_name的形式。假设我们在一个叫myapp的应用程序中建立以上数据模型,那么产生的权限名字就是myapp.add_test
class test(models.Model):
  name = models.CharField(max_length=32)
  class Meta:
    permissions = [(\'add_test\',\'在test表中增加记录的权限\')]
  • 通过代码增加权限,权限是django.contrib.auth.Permission的实例对象,可理解为权限记录保存在Permission表中,它包含namecodenamecontent_type 3个字段,其中的content_type与数据模型相关联,可以理解为content_type表示一个权限在哪个应用程序中的哪个数据模型中定义
# views.py
from django.http import HttpResponse
from . import models
from django.contrib.auth.models import Permission,ContentType

# 在此处编写视图函数代码
def add_permission(request):
 content_type=ContentType.objects.get_for_model(models.test)
 # 生成一条权限记录并保存在Permission表中
 permission=Permission.objects.create(codename=\'add_test\',name=\'在test表中增加记录的权限\',content_type=content_type)
 return HttpResponse(\'ok\')

案例说明

案例应用为au

目录结构

au
├─__init__.py
├─admin.py
├─apps.py
├─models.py
├─tests.py
├─urls.py
├─views.py
├─migrations
|     ├─0001_initial.py
|     ├─__init__.py
|     ├─__pycache__
|     |      ├─0001_initial.cpython-37.pyc
|     |      └__init__.cpython-37.pyc

views.py

# /au/views.py

from django.contrib.auth import authenticate, login
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json

# 加入csrf认证防止跨域报错
@csrf_exempt
def user_login(request):
  # 判断传输方式是否为get,登录传输表单需要post
    if request.method == \'GET\':
        return HttpResponse(\'跳转test_auth/login\')
    else:
      # 将post的body解析出username与password
        body = json.loads(request.body)
        username = body[\'username\']
        password = body[\'password\']
    # 通过解析传输过来的用户名与密码对用户认证
    user_obj = authenticate(username=username, password=password)
    if user_obj:
        # 让用户处于登录状态
        login(request, user_obj)
        return HttpResponse(\'跳转主页\')
    else:
        return HttpResponse(\'跳转login\')

models.py

# /au/models.py

from django.db import models
# 权限认证方法
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission

class authority(models.Model):
    codename = models.CharField(\'权限代码\', max_length=32)
    url = models.CharField(\'URL配置项名称\', max_length=128)
    name = models.CharField(\'权限描述\', max_length=120)

    # 重写数据模型的save()方法,实现了每增加一条记录,就增加一个权限
    def save(self, *args, **kwargs):
        # 取得content_type对象,该对象与test_auth中的authority数据模型有关联
        content_type_obj = ContentType.objects.get(app_label=\'au\', model="authority")
        # 增加一个权限,权限代码与字段codename的值相同,权限名与字段name的值相同
        permission = Permission.objects.create(codename=self.codename, name=self.name, content_type=content_type_obj)
        # 调用父类的save()方法将数据记录保存到数据库中
        super(authority, self).save(*args, **kwargs)

    # 重写了数据模型的delete()方法,实现了每删除一条记录,就删除权限代码
    def delete(self, *args, **kwargs):
        content_type_obj = ContentType.objects.get(app_label=\'au\', models=\'authority\')
        # 取出权限对象
        permission = Permission.objects.get(codename=self.codename, content_type=content_type_obj)
        content_type = content_type_obj
        # 删除权限
        permission.delete()
        # 调用父类的 delete()方法,删除这条记录
        # 因为当前类重写了save与delete方法,所以为了原始操作只能调用为变更过的父类方法
        super(authority, self).delete(*args, **kwargs)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = \'权限表\'
        verbose_name_plural = verbose_name

admin.py

# /au/admin.py
from django.contrib import admin
from . import models


# 定义默认admin页面展示字段
class AuthorityAdmin(admin.ModelAdmin):
    list_display = (\'codename\', \'url\', \'name\')


admin.site.register(models.authority, AuthorityAdmin)

以上是关于django权限认证的主要内容,如果未能解决你的问题,请参考以下文章

django的RBAC认证z;自定义auth_user表;认证组件权限组件源码分析;认证组件;权限组件

django(权限认证)系统——第三方组件实现Object级别权限控制

Django内置权限系统源码解读

django认证系统 Authentication

Django的用户认证----介绍

Django rest_framewok框架的基本组件