使用python3 Django 根据用户角色来校验权限装饰器

发布时间 2023-05-30 15:37:32作者: 就学45分钟

  1. 定义用户角色

在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)

  1. 定义权限

在Django中,可以使用装饰器或者中间件来实现权限控制。首先需要定义角色和权限之间的映射关系,可以使用一个字典来存储角色和权限的对应关系。

roles_permissions = {
    'admin': ['can_add_user', 'can_delete_user', 'can_edit_user'],
    'editor': ['can_add_article', 'can_edit_article'],
    'user': ['can_view_article']
}

  1. 编写装饰器

编写装饰器来检查用户的角色和权限。装饰器可以在视图函数执行前检查用户是否有权限执行该函数,如果没有权限则返回一个错误信息。

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

  1. 在视图函数中使用装饰器

在需要进行权限控制的视图函数上使用装饰器。

    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')