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表中,它蕴含
name
、codename
、content_type
3个字段,其中的content_type与数据模型相关联,能够了解为content_type示意一个权限在哪个应用程序中的哪个数据模型中定义
# views.pyfrom django.http import HttpResponsefrom . import modelsfrom 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.pyfrom django.contrib.auth import authenticate, loginfrom django.http import HttpResponse, JsonResponsefrom django.views.decorators.csrf import csrf_exemptimport json# 退出csrf认证避免跨域报错@csrf_exemptdef 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.pyfrom django.db import models# 权限认证办法from django.contrib.contenttypes.models import ContentTypefrom django.contrib.auth.models import Permissionclass 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.pyfrom django.contrib import adminfrom . import models# 定义默认admin页面展现字段class AuthorityAdmin(admin.ModelAdmin): list_display = ('codename', 'url', 'name')admin.site.register(models.authority, AuthorityAdmin)