您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“django怎么自定義權(quán)限系統(tǒng)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
最近項目中需要做套權(quán)限管理系統(tǒng),功能需求是對后端當(dāng)前所有接口添加個權(quán)限驗證功能,如果用戶有訪問這個接口權(quán)限則返回數(shù)據(jù),沒有這個接口的權(quán)限就提示用戶無權(quán)訪問該接口。屬于按鈕級別的權(quán)限控制。
用戶權(quán)限管理的思路,對角色進行權(quán)限的管理,判斷用戶屬于哪些個角色,這些角色有哪些權(quán)限,用戶就會有其角色對應(yīng)的權(quán)限??偟膩碚f是基于RABC 權(quán)限控制。
權(quán)限管理用到的 models 模型有
1.角色模型
2.權(quán)限名稱模型
3.用戶模型
相關(guān)模型代碼如下:
class PowerDetail(BaseModel):
name = models.CharField(verbose_name="權(quán)限明細名稱", max_length=20)
code = models.CharField(verbose_name="權(quán)限明細編碼", max_length=50, unique=True)
class Meta:
db_table = "base_power_detail"
unique_together = ("code", "name")
verbose_name = "角色權(quán)限明細"
verbose_name_plural = "角色權(quán)限明細"
ordering = ["id"]
def __str__(self):
return self.name
class Role(BaseModel):
user = models.ManyToManyField(BaseUser, related_name="roles")
name = models.CharField(verbose_name="角色名稱", max_length=20)
power_detail = models.ManyToManyField(PowerDetail, related_name="roles")
class Meta:
verbose_name = "用戶角色角色"
verbose_name_plural = "用戶角色"
def __str__(self):
return self.name
對用戶判斷權(quán)限時是查詢 redis ,沒有走 mysql 數(shù)據(jù)庫,這樣可以減少數(shù)據(jù)庫訪問的壓力。用戶的角色管理和角色的權(quán)限管理我是通過django自帶的 admin 進行管理。管理用戶角色時,通過重寫 admin 方法,把用戶對應(yīng)的權(quán)限保存到 redis 中。
判斷用戶是否有權(quán)限的代碼是通過一個裝飾器 check_power 實現(xiàn)的,代碼如下:
def check_user_power(user, power_code):
"""判斷員工是否有 power_code 對應(yīng)的權(quán)限"""
return r_db.sismember(get_user_power_key(user), power_code)
# 給類方法添加的裝飾器
def check_power(code):
def decode(func):
def wrapper(self, request, *args, **kwargs):
user = request.login_user
if not check_user_power(user, code):
return Response({"error": "沒有權(quán)限操作", "code": 401})
res = func(self, request, *args, **kwargs)
return res
return wrapper
return decode
class V1VideoClassView(APIView):
@check_power(PowerDetailCode.category_label_manage.code)
def get(self, request):
"""視頻分類"""
# {"id", "類別名稱"}
res = [{"id": key, "name": value} for key, value in class_dict.items()]
return Response(res)
“django怎么自定義權(quán)限系統(tǒng)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。