Python中如何对Django的业务操作进行权限管理?
阅读了一些文档,自带的权限管理是基于 model 作为资源,有对应的权限。但是如果我想对一些操作,没有向对应的模型,例如具体到某个接口,进行限制,请问大家有什么想法可以分享一下?是将这类型的都当做是一个资源,自己创建一个 model,作为操作权限模型,然后具体到某个接口,就创建相应的 permission ??
Python中如何对Django的业务操作进行权限管理?
哈,就推荐我这个 cancan 库,轻量简单:
https://www.v2ex.com/t/380614
在Django里做权限管理,核心就三板斧:用内置的权限系统、自己写装饰器、或者上更细粒度的django-guardian。
1. 内置权限(简单直接)
Django自动为每个模型创建add_、change_、delete_、view_权限。直接在视图里用@permission_required装饰器就行:
from django.contrib.auth.decorators import permission_required
@permission_required('app.view_model')
def my_view(request):
# 有view_model权限才能进
pass
2. 自定义装饰器(业务逻辑复杂时用) 比如要检查用户是不是资源所有者:
from functools import wraps
def check_owner_permission(model_class):
def decorator(view_func):
@wraps(view_func)
def wrapper(request, pk, *args, **kwargs):
obj = model_class.objects.get(pk=pk)
if request.user != obj.owner:
raise PermissionDenied
return view_func(request, pk, *args, **kwargs)
return wrapper
return decorator
@check_owner_permission(Article)
def edit_article(request, pk):
# 只有文章作者能编辑
pass
3. 对象级权限(需要django-guardian)
安装:pip install django-guardian
from guardian.shortcuts import assign_perm, get_objects_for_user
# 给用户分配对象权限
assign_perm('change_article', user, article)
# 检查权限
from guardian.decorators import permission_required_or_403
@permission_required_or_403('app.change_article', (Article, 'pk', 'pk'))
def article_detail(request, pk):
# 用户必须有对这个具体文章的权限
pass
总结建议:小项目用内置权限,复杂业务上django-guardian。
这个是基于模型下,对具体某个 object 的权限控制,是更细粒度的权限区分。但我这个权限是一种很抽象的行为,没有具体的 model。我觉得这个应该不适宜
具体不太了解。但觉得某个接口,某个操作也可以具象到一个 model 或者一个 object,换句话说,用 model 去描述你的某个接口 /操作。


