关于权限:
首先明确权限是为了限制其他访问的url
通过在models使之关联的表再通过关联表的权限来permissions的url 来检测url的访问
一.
需要三个类五张表
1 from django.db import models 2 3 # Create your models here. 4 class User(models.Model): 5 6 name=models.CharField(max_length=32) 7 roles=models.ManyToManyField("Role") 8 9 def __str__(self): 10 return self.name 11 12 class Role(models.Model): 13 14 title=models.CharField(max_length=32) 15 permissions=models.ManyToManyField("Permission") 16 17 def __str__(self): 18 return self.title 19 20 21 class Permission(models.Model): 22 23 title = models.CharField(max_length=32) 24 url = models.CharField(max_length=32) 25 is_menu = models.BooleanField(default=False) 26 icon=models.CharField(max_length=32,null=True,blank=True) 27 28 def __str__(self): 29 return self.title
二.
再通过admin来创建表的数据
注意的是,为了方便显示各字段,可以创建类引用ModelAdmin来进行修饰
1 from django.contrib import admin 2 3 from app01.models import User,Role,Permission 4 5 # Register your models here. 6 admin.site.register(User) 7 class RoleConfig(admin.ModelAdmin): 8 list_display = ["title"] 9 10 admin.site.register(Role,RoleConfig) 11 12 class PermissionConfig(admin.ModelAdmin): 13 list_display = ["title","pk","url","is_menu","icon"] 14 # list_editable = ['url', 'is_menu', 'icon'] 15 16 admin.site.register(Permission,PermissionConfig)
三.
创建好数据库后,需要在login上进行
验证登录
保存用户登录的状态信息写入session中(确认在登录)
查询当前登录人的权限列表
将权限列表写入session中
1 def login(request): 2 3 if request.method=="POST": 4 # 认证 5 6 user=request.POST.get("user") 7 8 user=User.objects.filter(name=user).first() 9 if user: 10 # 登录成功 11 12 # 保存登录用户状态信息 13 14 request.session["user_id"]=user.pk 15 16 # 查询当前登录人的所有权限列表 17 # 查看当前登录人的所有角色 18 # ret=Role.objects.filter(user=user) 19 20 permissions=Role.objects.filter(user=user).values("permissions__url").distinct() 21 print(permissions) 22 23 permission_list=[] 24 for item in permissions: 25 permission_list.append(item["permissions__url"]) 26 27 # 将当前登录人的权限列表注入session中 28 request.session["permission_list"]=permission_list 29 30 return HttpResponse("登录成功") 31 else: 32 val="HAPPY" 33 n=12 34 35 36 return render(request,'login.html',locals())
四.
通过中间件的形式来验证用户的使用权限
设置白名单
检验是否登录
校验权限
1 from django.utils.deprecation import MiddlewareMixin 2 from django.shortcuts import HttpResponse,redirect 3 import re 4 5 6 class PermissionMiddleWare(MiddlewareMixin): 7 8 def process_request(self,request): 9 print(1) 10 print("permission_list",request.session.get("permission_list")) 11 current_path = request.path 12 13 # 设置白名单放行 14 for reg in ["/login/","/admin/*"]: 15 ret=re.search(reg,current_path) 16 if ret: 17 return None 18 # /customers/edit/1 19 20 # 校验是否登录 21 22 user_id=request.session.get("user_id") 23 print("user_id",user_id) 24 if not user_id: 25 return redirect("/login/") 26 27 # 校验权限 28 29 30 permission_list=request.session.get("permission_list") 31 32 for reg in permission_list: 33 reg="^%s$"%reg 34 ret=re.search(reg,current_path) 35 if ret: 36 return None 37 38 return HttpResponse("无访问权限!")
这样初始的权限就完成了