尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

FuAdmin JWT认证实现原理:FuJwt与GlobalAuth接口级鉴权深度剖析

FuAdmin JWT认证实现原理:FuJwt与GlobalAuth接口级鉴权深度剖析 FuAdmin JWT认证实现原理FuJwt与GlobalAuth接口级鉴权深度剖析【免费下载链接】fu-admin采用当前最流行的技术栈 Vben Vue Vue3 Python Django NinjaFast Api 和 Django的结合开发的后端管理系统项目地址: https://gitcode.com/gh_mirrors/fu/fu-adminFuAdmin 是一套基于 Vben Vue3 Django Ninja 技术栈开发的后端管理系统其安全核心是JWT认证机制登录后签发 FuJwt 令牌再由 GlobalAuth 对每个接口做鉴权校验实现接口级的细粒度权限控制。本文带新手从源码出发逐步拆解 FuAdmin JWT认证 的完整实现原理搞懂 FuJwt 与 GlobalAuth 是如何协同工作的。登录如何签发JWT令牌理解认证的起点是登录接口。在 login.py 中/api/system/login接口处理流程如下调用 Django 内置的auth.authenticate校验账号密码校验通过后把用户信息id、角色、是否超管等作为载荷用FuJwt加上TOKEN_LIFETIME默认 12 小时在 settings.py 中配置生成过期时间返回bearer {jwt.encode()}格式的令牌jwt FuJwt(SECRET_KEY, user_obj_dic, valid_totime_now TOKEN_LIFETIME) token fbearer {jwt.encode()}之后的每次请求前端都会把令牌放在Authorization请求头里。服务端通过 usual.py 中的get_user_info_from_token从请求头取出令牌并解析出用户信息业务代码无需重复解析。FuJwtJWT令牌是怎么编码的FuJwt 的定义在 fu_jwt.py它继承自 simplejwt 库的Jwt类重写了encode方法。一个标准 JWT 由三段组成部分作用说明Header算法声明说明签名使用的算法Payload用户数据用户 id、角色、过期时间valid_toSignature防伪签名用SECRET_KEY对前两部分做哈希签名encode函数fu_jwt.py的核心逻辑签名密钥使用 Django 的SECRET_KEY配置在 settings.py日期兼容通过DateEncoder把 datetime 对象序列化为%Y-%m-%d %H:%M:%S格式签名方式_hash(secret, pre_signature, alg)对 headerpayload 拼接串做哈希保证令牌无法被篡改GlobalAuth接口级鉴权的核心逻辑GlobalAuth 是整套 JWT认证 的灵魂定义在 fu_auth.py。它继承 Ninja 的HttpBearerDjango Ninja 会在每个受保护接口执行前自动调用它的authenticate方法。校验链路可以画成请求进入 → 解析JWT → 检查过期(valid_to) → 判断用户类型 → 放行/拒绝具体判断顺序令牌过期检查valid_to 当前时间戳否则抛出 401token时间过期演示模式DEMO在 env.py 中开启后白名单接口和 GET 请求放行其余增删改请求统一返回演示环境保护线上演示数据超级管理员is_superuser为真时直接放行普通用户这是最精彩的部分——接口级鉴权接口级鉴权如何匹配普通用户能否访问某个接口取决于其角色绑定的菜单权限MenuButton表。匹配逻辑fu_auth.py先把请求路径末尾的数字 id 替换成/*如/api/system/user/5→/api/system/user/*因为接口定义里用的是{id}占位符检查路径是否在WHITE_LIST白名单中配置于 settings.py命中则放行否则查询MenuButton表用角色的permission关联的 id 接口地址正则匹配 请求方法GET/POST/PUT/DELETE 映射为 0-3见 fu_auth.py 的METHOD字典三重条件查到记录放行查不到则抛出 403没有权限MenuButton模型定义在 models.py其中api字段存接口地址method字段区分请求方法code字段权限值用于前端按钮级权限控制。这些权限数据正是在管理后台的菜单管理、角色管理中配置见上文截图管理员勾选角色可访问的接口无需写任何代码。数据权限接口放行后的第二道防线接口能访问不代表能看所有数据。fu_auth.py 中的data_permission函数配合 fu_ninja.py 的FuFilters实现按角色的数据范围过滤data_range范围过滤条件0仅本人数据creator_id 当前用户1本部门数据belong_dept 用户部门2本部门及以下递归部门树usual.py 的get_dept3自定义角色关联的部门列表4全部数据不过滤多角色时取权限最大的范围超级管理员则完全不过滤。总结FuAdmin 认证体系文件清单文件职责fu_jwt.pyFuJwt 令牌编码fu_auth.pyGlobalAuth 鉴权 数据权限login.py登录签发令牌、获取用户信息与权限码usual.py从请求头解析用户信息env.pyDEMO 演示模式等环境开关settings.py令牌有效期、接口白名单一句话概括FuAdmin 用FuJwt 签发令牌GlobalAuth 校验令牌MenuButton 接口级鉴权data_permission 数据级过滤四层环环相扣既保证了接口安全又实现了角色-接口-数据三位一体的细粒度权限管理这正是它作为 Django 后台管理系统框架的核心竞争力。【免费下载链接】fu-admin采用当前最流行的技术栈 Vben Vue Vue3 Python Django NinjaFast Api 和 Django的结合开发的后端管理系统项目地址: https://gitcode.com/gh_mirrors/fu/fu-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表