瀏覽目錄
簡單控制
查看有沒有權限,最簡單的做法就是直接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("不好意思,您沒有訪問權限!")