Django权限可以模型可以分为三个User,Role,Permission。一个用户可以有多个角色,一个角色可以有多个权限,一个权限也可以赋予多个角色,而实际上权限就是限制用户访问某些页面,所以权限实际上就是URL,所以建立如下表。
from django.db import models
# Create your models here.
class Permission(models.Model):
url=models.CharField(max_length=64)
title=models.CharField(max_length=20)
def __str__(self):
return str(self.title)
class Role(models.Model):
name=models.CharField(max_length=64)
permission=models.ManyToManyField(Permission)
def __str__(self):
return str(self.name)
class User(models.Model):
username=models.CharField("用户名",max_length=64)
pwd=models.CharField("密码",max_length=64)
role=models.ManyToManyField(Role)
我们接下来用两种方式实现权限验证,一种是装饰器,一种是中间件。
装饰器:
def permission(func):
def result(request):
path=request.path
per_list=request.session['permission_list']
for i in per_list:
i='^'+i+'$'
ret=re.match(i,path)
if ret:
return func(request)
return HttpResponse("无权限")
return result
中间件:
首先需要创建一个中间件
from django.utils.deprecation import MiddlewareMixin
import re
from django.shortcuts import HttpResponse
class PermissionMiddle(MiddlewareMixin):
def process_request(self, request):
path=request.path
#检查白名单
vaild_url_list=['/login/','/admin/.*']
for i in vaild_url_list:
ret=re.match(i,path)
if ret:
return
#校验权限
per_list=request.session['permission_list']
flag=False
for i in per_list:
i="^%s$"%i
ret=re.match(i,path)
if ret:
flag=True
break
if not flag:
return HttpResponse("no permission")
接下来在适当的地方加入,就是再每一个用户login的时候,把他的权限存入session,而中间件会有一个白名单,实际上是一个url正则表达式数组。
def init_permission(user,request):
request.session['user_id'] = user.pk
temp = []
ret = user.role.all().values('permission__url').distinct()
for per in ret:
temp.append(per['permission__url'])
request.session['permission_list'] = temp