使用python3 Django 根据用户角色来校验权限装饰器
- 定义用户角色
在Django中,通常使用User模型来表示用户,可以通过扩展User模型来增加角色属性。例如,可以定义一个Profile模型扩展User模型,并在Profile模型中增加一个roles字段,用于保存用户的角色信息。
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
roles = models.CharField(max_length=50)
- 定义权限
在Django中,可以使用装饰器或者中间件来实现权限控制。首先需要定义角色和权限之间的映射关系,可以使用一个字典来存储角色和权限的对应关系。
roles_permissions = {
'admin': ['can_add_user', 'can_delete_user', 'can_edit_user'],
'editor': ['can_add_article', 'can_edit_article'],
'user': ['can_view_article']
}
- 编写装饰器
编写装饰器来检查用户的角色和权限。装饰器可以在视图函数执行前检查用户是否有权限执行该函数,如果没有权限则返回一个错误信息。
from functools import wraps
from django.http import HttpResponseForbidden
def role_required(*roles):
def decorator(view_func):
@wraps(view_func)
def wrapped_view(request, *args, **kwargs):
user = request.user
if user.is_authenticated:
profile = Profile.objects.get(user=user)
if any(role in profile.roles for role in roles):
return view_func(request, *args, **kwargs)
return HttpResponseForbidden('You do not have permission to access this page')
return wrapped_view
return decorator
def permission_required(permission):
def decorator(view_func):
@wraps(view_func)
def wrapped_view(request, *args, **kwargs):
user = request.user
if user.is_authenticated:
profile = Profile.objects.get(user=user)
if permission in roles_permissions.get(profile.roles, []):
return view_func(request, *args, **kwargs)
return HttpResponseForbidden('You do not have permission to access this page')
return wrapped_view
return decorator
- 在视图函数中使用装饰器
在需要进行权限控制的视图函数上使用装饰器。
python @role_required('admin')
def add_user(request):
# 添加用户
return HttpResponse('Add User Success')
@permission_required('can_add_user')
def add_user(request):
# 添加用户
return HttpResponse('Add User Success')
作者:就学45分钟
出处:https://www.cnblogs.com/tjw-bk/p/17443390.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了