使用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')
从小白到大神的蜕变~~