当前位置: 首页 > news >正文

2026 年山东大学软件学院创新项目实训博客(七)

一、工作进展

在测试中发现之前的 JWT 令牌无法提供身份 id 的识别,现进行修改。

本阶段主要完成了基于 JWT 的统一身份识别与数据归属校验后端能力:在短信/微信登录签发访问令牌后,将用户主键写入 JWT 的subject,通过全局过滤器在请求入口解析令牌并写入线程上下文;业务层通过JwtUserContextElderlyAccessService获取当前用户 id 与角色,在健康数据、用药计划、病历等接口上按「老人本人 / 家属已绑定老人」过滤读写范围,避免「只验登录、不验归属」导致的越权查询。

本人工作:

  • 梳理登录态与业务主键关系:JWTsub对应elderly/family表主键,userType区分ELDERLY/FAMILY,登录响应同步返回userIdaccessToken供前端持久化。

  • 实现JwtService.resolvePrincipal/resolveUserId,统一从Authorization: Bearer解析身份,避免各 Controller 重复手写 Bearer 截取与parseAccessToken

  • 新增JwtAuthFilter+JwtUserContext:除登录、发码、Swagger 等白名单路径外,默认要求有效 JWT;请求结束finally清理 ThreadLocal,防止线程池复用串用户。

  • 实现ElderlyAccessServiceElderlyScopedCrudSupport,将「当前用户能访问哪些老人 id」沉淀为可复用校验,并接入健康数据、疾病、病历、用药计划等多模块*ForCurrentUser()读写。


二、具体内容

策略说明: 身份以服务端验签后的 JWT 为唯一可信来源,不信任客户端单独传入的「我是谁」;用户 id 落在标准字段sub中,避免与业务表主键语义脱节。入口过滤器负责「是否登录」,Service 层负责「是否允许访问该老人数据」;家属账号通过elderly_family绑定关系扩展可访问范围,与老人端「仅本人」形成对称规则。触达与存储仍走现有 PostgreSQL + 短信/OSS 能力,本阶段不新增登录表,仅在既有completeSmsLogin流程上签发令牌。

本周新增/调整的主要代码内容如下:

  1. 登录与令牌

  • 签发:JwtServiceImpl.generateAccessTokenuserId写入subjectuserTypephoneopenId写入自定义 claims;短信登录AuthServiceImpl.completeSmsLogin返回SmsLoginResponse(含accessTokenuserIdelderlyId等)。

  • 解析:resolvePrincipal(authorization)校验 Bearer 格式 →parseAccessToken→ 封装JwtPrincipal(userId, userType, phone, openId)resolveUserId供仅需主键的场景直接调用。

  • 白名单:/api/auth/sms-login/api/auth/sms/send-code/api/auth/sms/send及 Swagger 路径不经过过滤器,其余接口无 token 返回 401。

  1. 请求上下文与全局过滤器

  • JwtAuthFilterOncePerRequestFilter,解析成功后JwtUserContext.set(principal)doFilter结束后clear()

  • JwtUserContext: 提供requireUserId()requireFamilyId()requireElderlyId()requirePrincipal(),供 Controller / Service 在同一次请求内获取已校验身份。

  • TraceIdFilter: 通过@Order保证 traceId 与 JWT 过滤器执行顺序清晰。

  1. 数据归属与业务接入

  • ElderlyAccessServiceassertCanAccessElderly(elderlyId)——老人仅本人,家属仅bindStatus=1的绑定老人;listAccessibleElderlyIds()供列表查询IN过滤;resolveWritableElderlyId()写入时老人强制本人 id、家属须显式传elderlyId

  • ElderlyScopedCrudSupport: 封装带elderlyId实体的 list/get/add/update/delete 权限模板;MedicationScheduleTimemedication_plan间接关联老人 id 单独处理。

  • Controller 改造: 原service.list()/getById()改为listForCurrentUser()/getForCurrentUser(id)等;AuthController绑定老人接口从JwtUserContext.requireFamilyId()取家属 id,不再依赖重复解析 Header 的私有方法。

  1. 与现有业务的衔接

  • OSS 病历上传: 仍限制老人账号申请 STS(OssStsController+requireElderlyId()),与「用户 id = JWT subject」一致。

  • Agent / 会话模块: 为与master合并顺利,聊天会话相关 4 个文件暂对齐主分支实现;JWT 全链路鉴权与健康、用药等 CRUD 权限已保留,会话归属校验留待与 DB 版会话表统一后迭代。

  • 前端约定: 登录后存accessToken,业务请求带Authorization: Bearer <token>;家属操作老人数据需传elderlyId;401 引导重新登录。


三、问题与处理

问题处理
仅部分接口手写解析 JWT,大部分「查信息」不知道当前用户增加 JwtAuthFilter 默认鉴权 + JwtUserContext,统一入口确立身份
用户 id 在 JWT 里如何取、是否有 userId 字段使用标准 sub 作为用户主键;resolvePrincipal 统一封装,登录响应额外返回 userId 便于前端展示
家属能否访问未绑定老人健康数据ElderlyAccessService 查 elderly_family 绑定关系,无绑定 403
合并 master 时 PR 不可自动合并4 个 Agent/会话文件恢复为 master 版本;删除跟踪的 .idea/ 并与主分支 .gitignore 对齐,消除 modify/delete 冲突
ElderlyAccessService 与 ElderlyFamilyService 循环依赖绑定关系查询改为注入 ElderlyFamilyMapper,打破 Service 环依赖

四、下周计划

  • 与前端完成登录态联调:统一请求封装、token 刷新/过期处理与 401 跳转策略。

  • master合并 JWT 能力后,将会话模块(DB 持久化)与ownerUserId归属校验对齐,避免会话列表越权。

  • 完成项目最终联调。

http://www.jsqmd.com/news/975085/

相关文章:

  • 明日方舟素材资源库:3分钟掌握完整素材使用指南
  • 九大网盘直链下载完整指南:如何一键获取真实下载地址的终极解决方案
  • DSP56300 ECP并口DMA高速数据传输实战:原理、配置与优化
  • DevOps 入门系列:从 Pod 到 Ingress(K8s 核心概念)
  • Windows系统优化架构重构:基于PowerShell的自动化配置管理方案
  • 026 年 Q2 网红螺蛳粉加盟 推荐权威排名:TOP5 推荐榜、网红螺蛳粉加盟”、“2026年热门螺蛳粉加盟品牌及费用 - 安互工业信息
  • 2026职场高阶能力含金量排行榜20名:进阶避坑与职业发展指南
  • 国内广告标识工厂哪家经验丰富?2026采购方经验评估指南 - 资讯快报
  • 杭州伴手礼红黑榜|本地人私藏的非遗糕点,这才是正宗杭州味 - 玖叁鹿
  • Sunshine游戏串流终极指南:构建你的个人云游戏服务器
  • ncmppGui极速解密教程:3分钟掌握NCM音乐文件转换技巧
  • MFC与Windows钩子实战:构建来电显示程序的技术解析
  • Day 8:手撸一个豆包!流式输出 + 工具调用 + Web聊天应用
  • ChatGPT 5.5 进阶玩法:自定义指令、记忆功能、多轮对话的深度使用技巧
  • 如何用RTAB-Map视觉SLAM让机器人看懂复杂世界:5步构建精准3D地图
  • D2DX宽屏补丁:如何让经典《暗黑破坏神2》在现代电脑上焕发新生?
  • 山东这几所叛逆孩子封闭特训学校,帮孩子走出青春困境(2026最新公布) - 小途xt
  • 2026年如何挑选口碑出众专业靠谱的国内双级滤波器供应商
  • MPC184硬件加密描述符:静态与动态模式解析与性能优化
  • 泰安闲置黄金变现指南!2026年6月金价走高,这些回收门店值得信赖 - 余生黄金回收
  • 纯标准C写的国密SM2/SM3算法源码,不依赖系统API,轻松跑在STM32和PC上
  • GetQzonehistory终极指南:如何永久保存你的QQ空间记忆
  • 河南大学C#网络编程实验代码集:WPF客户端+Socket服务器双端可运行工程
  • Windows平台B站直播弹幕点歌工具:集成VLC播放器+实时歌词+图形配置界面
  • AI 太阳能花园灯智能功率 MOSFET 高效能选型方案
  • Go 的类型系统
  • 如何构建基于YOLOv5的实时AI视觉瞄准系统:技术架构与性能优化深度解析
  • # 2026湖州免砸砖漏水维修全攻略|卫生间/阳台/厨房/屋顶根治方法+避坑指南|苏易修缮 - 苏易修缮
  • 高校迎新季专用网页版校园导航工具,含建筑定位与步行路径规划功能
  • 2026 AI Agent 学习路线图:从小白到实战,系统掌握智能体开发