Django 按組控制權(quán)限類及定義方法詳解
任務(wù)描述
后端接口,能夠方便的使用角色組權(quán)限控制, 例如
# 基于函數(shù)的控制 @api_view(['GET']) @permission_groups(['開發(fā)組','測試組']) def api(request): return Response() # 或者在類中 class SomeViewSet(): group_names = ['開發(fā)組','測試組']
只要增加一行代碼, 聲明組名稱, 就能夠讓這個接口只對該角色開放權(quán)限.
方法
思路很簡單, 就是仿照 DRF 的權(quán)限控制, 自定義自己的權(quán)限驗證行為即可.
權(quán)限類定義
仿照drf的權(quán)限類 IsAuthenticated 的寫法:
class IsAuthenticated(BasePermission): def has_permission(self, request, view): return bool(request.user and request.user.is_authenticated)
我們的權(quán)限類,需要一個組名稱的參數(shù), 所以需要用工廠模式, 根據(jù)參數(shù), 動態(tài)生成類.
def sigma_permission(): class SigmaPermission(BasePermission): def __init__(self, group_names: List[GroupName] = None): self._sigma_groups = group_names def has_permission(self, request, view): if request.user.is_anonymous: return False return set(request.user.groups.all().values_list('name', flat=True)) & set(self._sigma_groups) return SigmaPermission # 能夠接受參數(shù)的權(quán)限類 SigmaPermissionFactory = sigma_permission()
我們用類似閉包的形式, 構(gòu)建了自己的權(quán)限類 SigmaPermission
, 并且能夠接收組名稱列表作為參數(shù), 內(nèi)部方法 has_permission
實現(xiàn)了權(quán)限驗證的工作.
下面, 就要要看看權(quán)限類該怎么使用. 根據(jù)兩種場景, 分別采用裝飾器和基類繼承的方式.
基于函數(shù)的權(quán)限控制
可以參考drf的 permission_classes
裝飾器的寫法
def permission_classes(permission_classes): def decorator(func): func.permission_classes = permission_classes return func return decorator
我們定義自己的組權(quán)限裝飾器:
def permission_groups(group_names: List[GroupName]): """ 組權(quán)限裝飾器 """ def decorator(func): groups_permission = SigmaPermissionFactory(group_names) if hasattr(func, 'permission_classes') and func.permission_classes is not None: func.permission_classes = [*func.permission_classes, lambda: groups_permission] else: func.permission_classes = [lambda: groups_permission] return func return decorator
注意: 這里注冊 permission_classes
時, 必須要用 lambda 函數(shù)的方式. 這是因為, 我們的類工廠生成 groups_permission 時, 已經(jīng)完成了初始化. 而Python的類只有在初始化時是 callable 的, 一旦初始化完成之后, 就不能再次callable. 而 permission_classes
里的元素必須可以 callable , 所以用 lambda 函數(shù)的方式實現(xiàn).
基于類的權(quán)限控制
這個方法就簡單許多, 只用重載 get_permissions
方法就行.
class SigmaViewSet(ModelViewSet):
def get_permissions(self): permissions = [permission() for permission in self.permission_classes] if hasattr(self, 'group_names '): groups_permission = SigmaPermissionFactory(self.group_names ) permissions.append(groups_permission) return permissions
總結(jié)
通過這個案例, 我們能夠?qū)W到工廠函數(shù)/類的callable/lambda 函數(shù)的使用場景.
以上就是Django 按組控制權(quán)限類及定義方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Django 按組控制權(quán)限的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用Pandas實現(xiàn)對數(shù)據(jù)進行移動計算
這篇文章主要為大家詳細(xì)介紹了如何利用Pandas實現(xiàn)對數(shù)據(jù)進行移動計算,文中的示例代碼講解詳細(xì),對我們了解Pandas有一定幫助,需要的可以參考一下2022-07-07Python時間戳與時間字符串互相轉(zhuǎn)換實例代碼
這篇文章主要介紹了Python時間戳與時間字符串互相轉(zhuǎn)換實例代碼,大家參考使用2013-11-11Python matplotlib的使用并自定義colormap的方法
今天小編就為大家分享一篇Python matplotlib的使用并自定義colormap的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12