django权限系统实现步骤_在django中实现一个简单的权限管理
首先在models.py里先加入我們需要的表
Meta里的參數自己定義,我這里定義了3個,作為我的權限分類,定義好之后我們可以在django-admin里看到我們的權限分類,當我們添加用戶的時候也可以指定這3個權限給用戶。
class Permission(models.Model):
name = models.CharField("權限名稱", max_length=64)
url = models.CharField('URL名稱', max_length=255)
per_method = models.CharField('請求方法', max_length=10)
describe = models.CharField('描述', max_length=255)
def __str__(self):
return self.name
class Meta:
verbose_name = '權限表'
verbose_name_plural = verbose_name
#權限信息,這里定義的權限的名字,后面是描述信息,描述信息是在django admin中顯示權限用的
permissions = (
('readonly', '全平臺只讀'),
('app_admin','平臺管理員權限'),
('dashboard','儀表盤只讀'),
定義好我們的權限表,我們再定義個權限判斷的方法
在models.py的同級目錄下新建一個permission.py,名字隨意定
# -*- coding:utf-8 -*-
from django.shortcuts import render
from app.models import *
from django.db.models import Q
from django.urls import resolve #此方法可以將url地址轉換成url的name
import logging
from logging.handlers import TimedRotatingFileHandler
logger = logging.getLogger("ALERT LOG FORMAT")
logger.setLevel(logging.DEBUG)
LOG_FILE="/tmp/alert.log"
fh = TimedRotatingFileHandler(LOG_FILE,when='D',interval=1,backupCount=30) #按天分割日志,保留30天
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
def perm_check(request, *args, **kwargs):
user_perm = list(request.user.get_all_permissions()) #獲取用戶權限
if len(user_perm) < 0:
print("用戶沒有權限")
return False
user_method = request.method #獲取用戶的方法get|post
# get_perm = Permission.objects.filter(name=user_perm) #使用用戶權限名稱查找用戶的具體權限
url_obj = resolve(request.path_info)
url_name = url_obj.url_name #獲取當前用戶訪問的url地址
for perm in user_perm:
query = Permission.objects.filter(name=perm.split(".")[1])
print(query)
method = query[0].per_method
url = query[0].url
if url == "ALL" and method == "ALL":
print("用戶具有平臺管理員權限")
return True
elif url == "ALL" and method == "GET":
print("用戶具有平臺只讀權限")
return True
else:
if url_name == url and user_method == method:
print("權限已經匹配")
return True
else:
print("權限沒有匹配")
return False
def check_permission(fun): #定義一個裝飾器,在views中應用
def wapper(request, *args, **kwargs):
if perm_check(request, *args, **kwargs): #調用上面的權限驗證方法
return fun(request, *args, **kwargs)
return render(request, '403.html', locals())
return wapper
這個方法會提取用戶的權限和上面我們定義的表中的權限相匹配,成功的返回True,否則返回False
下面是我簡單定義的權限
(root[@127.0.0.1](https://my.oschina.net/u/567043):)[app]> select * from app_permission;
+----+-----------+-----------+------------+-----------------------+
| id | name | url | per_method | describe |
+----+-----------+-----------+------------+-----------------------+
| 1 | dashboard | dashboard | GET | 主頁瀏覽權限 |
| 2 | app_admin | ALL | ALL | 平臺管理員權限 |
| 4 | readonly | ALL | GET | 全平臺只讀 |
+----+-----------+-----------+------------+-----------------------+
好了,最后在views里調用
from app.permission import check_permission
@csrf_exempt
@check_permission
def backup_recovery(request):
if request.user == "AnonymousUser":
return HttpResponseRedirect('/login')
data = backup_failure.objects.all()
return render(request,'backup_recovery.html',{'data':data})
簡單的使用裝飾器的方法調用一下即可。
總結
以上是生活随笔為你收集整理的django权限系统实现步骤_在django中实现一个简单的权限管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaweb+C+asp毕业设计项目合
- 下一篇: 【ES10(2019)】String 扩