Django的RBAC认证和权限

1.认证

python 复制代码
import jwt
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rbac import settings


class User(object):
    def __init__(self, id, username, role, exp):
        self.id = id
        self.username = username
        self.role = role
        self.exp = exp



class RbacAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 1. 获取jwt token
        jwt_token = request.query_params.get("token")
        if not jwt_token:
            return AuthenticationFailed("认证失败")
        # 2.校验jwt token合法性
        try:
            verified_payload = jwt.decode(jwt_token, settings.SECRET_KEY, algorithms="HS256")
            print(verified_payload)
        except Exception as e:
            raise AuthenticationFailed("认证失败")

        # 3. 返回
        user = User(**verified_payload)
        return user, jwt

    def authenticate_header(self, request):
        return "API"

2.权限

python 复制代码
from rest_framework.permissions import BasePermission

from rbac import settings


class RbacPermission(BasePermission):
    def has_permission(self, request, view):
        # 1.当前用户角色
        user_role = request.user.role
        # 2.获取当前权限
        user_total_permission = settings.PERMISSION.get(user_role)

        # 3.当前用户请求的路由信息
        router_name = request.resolver_match.view_name
        method = request.method.lower()
        method_list = user_total_permission.get(router_name)
        if not method_list:
            return False
        if method not in method_list:
            return False
        return True

3.全局配置

python 复制代码
REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER": None,
    "UNAUTHENTICATED_TOKEN": None,
    "DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.RbacAuthentication"],
    "DEFAULT_PERMISSION_CLASSES": ["utils.permission.RbacPermission"]
}
相关推荐
BING_Algorithm几秒前
Java多线程全体系教程 - 第二篇:Java多线程核心原理·线程安全与锁机制篇
后端
Polar__Star3 分钟前
PHP新手如何评估AI成本_预算控制方法【教程】
jvm·数据库·python
徐志斌8 分钟前
Linux 内核与 Zero-Copy 零拷贝
后端
Java编程爱好者8 分钟前
Spring-Boot-缓存实战-@Cacheable-这10个坑
后端
m0_4939345310 分钟前
TensorFlow如何监控内存使用情况_结合tf.summary记录关键指标信息
jvm·数据库·python
Polar__Star19 分钟前
Go语言中--=运算符详解:位右移赋值操作的原理与实践
jvm·数据库·python
不考研当牛马20 分钟前
python 第21课 基础完结(UDP套接字)
开发语言·python·udp
qq_1898070321 分钟前
Navicat导出JSON数据为空如何解决_过滤条件与权限排查
jvm·数据库·python
2301_8135995522 分钟前
HTML表单能嵌套吗_表单嵌套限制与替代方案【解答】
jvm·数据库·python
yejqvow1225 分钟前
如何使用可视化查询生成器_免敲代码的多表JOIN配置
jvm·数据库·python