權限粒度控制


瀏覽目錄

 

簡單控制

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM