django 許可權設定
阿新 • • 發佈:2018-11-15
關於許可權:
首先明確許可權是為了限制其他訪問的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 9modelsdef __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來進行修飾
1adminfrom 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())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("無訪問許可權!")中介軟體檢驗許可權
這樣初始的許可權就完成了