django 权限设置

关于权限:

首先明确权限是为了限制其他访问的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
models

二.

再通过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)
admin

三.

创建好数据库后,需要在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())
login录入session权限

四.

通过中间件的形式来验证用户的使用权限

设置白名单

检验是否登录

校验权限

 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("无访问权限!")
中间件检验权限

这样初始的权限就完成了

原文地址:https://www.cnblogs.com/zhangqing979797/p/9962357.html