瀏覽目錄
簡單控制
查看有沒有權限,最簡單的做法就是直接for循環
{% if "users/add" in permissions_list%}
例如:查看用戶有沒有添加用戶的權限,如果有就顯示添加用戶按鈕,沒有則隱藏。
{% if "users/add" in request.actions %}
<button class="btn btn-primary">添加用戶</button>
{% endif %}
擺脫表控制
更改數據庫結構
為了方便知道用戶都有哪些權限,給用戶展示哪些權限,我們就需要權限組來為我們區分。
新添一張表權限組表。
# 權限表
class Permission(models.Model):
title = models.CharField(max_length=32)
url = models.CharField(max_length=32)
action=models.CharField(max_length=32,default="")
group=models.ForeignKey(to="PermissionGroup",default=1)
def __str__(self):
return self.title
# 權限組
class PermissionGroup(models.Model):
title=models.CharField(max_length=32)
def __str__(self):
return self.title
我們一般是先看到的是列表頁面,在這個頁面上是否顯示添加,是否顯示編輯,是否顯示刪除,都是需要判斷的。
有無添加權限,有無刪除權限,有無編輯權限,我們可以給每一個url一個代號
dict = {
1:{ 代號
/users/ list
/users/add/ add
/users/del(\d+)/ del
/users/edit(\d+)/ edit
}
}
通過admin錄入權限數據
class PerConfig(admin.ModelAdmin):
list_display = ["title","url","action","group"] #顯示字段
admin.site.register(UserInfo)
admin.site.register(Role)
admin.site.register(Permission,PerConfig) #綁定PerConfig類
admin.site.register(PermissionGroup)

有了權限組,可以直接按照action來查看權限。
例如:查看用戶有沒有添加用戶的權限,如果有就顯示添加用戶按鈕,沒有則隱藏。
{% if "add" in request.actions %}
<button class="btn btn-primary">添加用戶</button>
{% endif %}
簡單類控制
通過類的實例化對象可以直接通過“.”來調用類中的方法,進行簡單操作。
views.py
class Per(object):
def __init__(self, actions):
self.actions = actions
def add(self):
return "add" in self.actions
def delete(self):
return "delete" in self.actions
def edit(self):
return "edit" in self.actions
def list(self):
return "list" in self.actions
如果要查看登錄用戶對用戶表都有哪些權限,可以實例化一個對象。

例如:查看用戶有沒有添加用戶的權限,如果有就顯示添加用戶按鈕,沒有則隱藏。
{% if per.add %}
<button class="btn btn-primary">添加用戶</button>
{% endif %}
登錄驗證
#查詢當前登錄用戶的所有權限,按照url,分組id,每個權限要做的操作展示,權限列表去重
permissions = user.roles.all().values("permissions__url", "permissions__group_id", "permissions__action").distinct()
print("permissions",permissions)
#當前登錄用戶所有權限如下:
'''permissions <QuerySet
[{'permissions__url': '/users/',
'permissions__action': 'list',
'permissions__group_id': 1},
{'permissions__url': '/users/add',
'permissions__action': 'add',
'permissions__group_id': 1},
{'permissions__url': '/users/delete/(\\d+)',
'permissions__action': 'delete',
'permissions__group_id': 1},
{'permissions__url': '/roles/',
'permissions__action': 'list',
'permissions__group_id': 2},
{'permissions__url': '/users/edit/(\\d+)',
'permissions__action': 'edit',
'permissions__group_id': 1}]>
'''
上面的數據我們使用起來並不是很方便,怎樣才能得到我們想要的數據呢?我們可以以字典的形式存儲他們,方便我們查詢。
permission_dict={} #建立一個空字典
for item in permissions: #循環每個權限
gid=item.get("permissions__group_id") #取到組id,組作為字典的鍵
if not gid in permission_dict: #如果沒有組作為鍵,新建鍵名再添加數據
permission_dict[gid]={
"urls":[item["permissions__url"],],
"actions":[item["permissions__action"],],
}
else: #有鍵則直接添加數據
permission_dict[gid]["urls"].append(item["permissions__url"])
permission_dict[gid]["actions"].append(item["permissions__action"])
print(permission_dict)
#在session中注冊權限字典,方便后面查詢
request.session["permission_dict"]=permission_dict
就會得到以下的數據:
'''{{'1':
{'urls': ['/users/', '/users/add', '/users/delete/(\\d+)', '/users/edit/(\\d+)'],
'actions': ['list', 'add', 'delete', 'edit']},
'2': {'urls': ['/roles/'],
'actions': ['list']}}
'''
中間件檢驗權限
有了注冊在session中的permission_dict字典,我們就可以很方便的查詢每個用戶所擁有的權限。
'''權限校驗二'''
permission_dict=request.session.get("permission_dict") #將權限字典在session中注冊
print(permission_dict)
for item in permission_dict.values(): #按組循環
urls=item["urls"] #urls為每個組中的所有url
for rule in urls: #遍歷所有url
rule="^%s$"%rule # 字符串拼接重新定義權限
ret=re.match(rule,current_path) #按規則匹配當前路徑
if ret: #匹配成功
print("actions",item["actions"])
request.actions=item["actions"] #給對象設置屬性,后面調用request.actions就能拿到當前用戶對當前表所有權限
return None
return HttpResponse("不好意思,您沒有訪問權限!")
