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

剖析 Sa-Token (三) 权限认证的注解驱动与拦截器协同

1. 注解驱动的权限认证设计原理

第一次看到@SaCheckPermission注解时,我盯着那个小小的@符号发了半天呆——就这么个简单的标记,居然能自动完成权限校验?这背后到底藏着什么魔法?后来在项目里踩过几次坑才明白,注解本质上就是个"标记牌",真正干活的其实是藏在幕后的拦截器。

Sa-Token的权限注解支持四种关键参数配置:

  • value:权限码数组,支持多个权限同时校验
  • mode:验证模式,AND表示需同时具备所有权限,OR表示具备任一即可
  • type:多账号体系标识,适合复杂权限系统
  • orRole:权限不满足时的备选角色方案

举个例子,下面这个配置就很有意思:

@SaCheckPermission( value = "user:delete", mode = SaMode.OR, orRole = {"admin", "super-admin"} ) public void deleteUser() { // 删除用户操作 }

这表示调用该方法需要满足:要么有user:delete权限,要么具备admin或super-admin角色。我在电商项目里就用这种组合方案,既保证了权限粒度,又避免了给高管分配过多具体权限。

2. 拦截器如何捕获注解信息

记得第一次调试SaAnnotationInterceptor时,我在preHandle方法里打了断点。当请求进来时,看到handler对象居然能转换成HandlerMethod,当时就觉得Spring的设计真巧妙。这个拦截器的工作流程其实很清晰:

  1. 将handler强制转换为HandlerMethod获取方法对象
  2. 把方法对象丢给SaStrategy做注解检查
  3. 通过验证就放行,不通过就抛出异常

关键代码其实就三行:

if (handler instanceof HandlerMethod == false) return true; Method method = ((HandlerMethod) handler).getMethod(); SaStrategy.me.checkMethodAnnotation.accept(method);

但这里有个坑我踩过——如果Controller里混用了普通请求和WebSocket等特殊请求,记得要做类型判断。有次线上事故就是因为没判断handler类型,导致WebSocket连接被错误拦截。

3. 策略模式在权限校验中的应用

SaStrategy这个类名起得特别到位,它确实把校验策略玩出了花。看它的checkByAnnotation方法,会根据注解配置选择不同验证策略:

if(at.mode() == SaMode.AND) { this.checkPermissionAnd(permissionArray); } else { this.checkPermissionOr(permissionArray); }

最精妙的是它对异常的处理——当权限校验失败时,还会尝试检查orRole配置的角色:

catch (NotPermissionException e) { if(at.orRole().length > 0) { // 尝试角色校验 } throw e; }

这种设计让权限系统既严格又灵活。我在金融项目里就用这个特性实现了"权限不够角色补"的机制,风控部门的同事再也不用频繁申请临时权限了。

4. 权限数据的获取链路解析

追查getPermissionList方法时,我发现了个有趣的设计。SaManager并没有直接持有权限数据,而是通过StpInterface接口获取:

public List<String> getPermissionList(Object loginId) { return SaManager.getStpInterface().getPermissionList(loginId, loginType); }

这种解耦设计让数据源可以灵活替换。有次需要从Redis获取权限,我只花了半小时就实现了自定义的StpInterface:

public class RedisStpInterface implements StpInterface { @Override public List<String> getPermissionList(Object loginId, String loginType) { // 从Redis获取权限列表 } }

更妙的是SaManager的自动装配机制。通过@Autowired自动注入实现类,连配置文件都不用改:

@Autowired(required = false) public void setStpInterface(StpInterface stpInterface) { SaManager.setStpInterface(stpInterface); }

5. 实战中的典型问题排查

在微服务环境下,我遇到过注解不生效的情况。后来发现是拦截器顺序问题,Spring的拦截器链是有执行顺序的。解决方法是在配置类里加上:

@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaAnnotationInterceptor()) .addPathPatterns("/**") .order(Ordered.HIGHEST_PRECEDENCE); }

另一个常见问题是权限缓存更新。当用户权限变更时,记得调用StpUtil.getPermissionList()的重载方法强制刷新:

// 强制从数据源重新加载 List<String> permissions = StpUtil.getPermissionList(userId, true);

有次线上权限失效,就是因为忘了这个参数,导致用户权限变更后依然读取旧缓存。现在我的团队都养成了习惯——所有权限修改操作后必须主动清除缓存。

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

相关文章:

  • AGI立法进程加速,政策制定者如何避免“技术盲区”?——基于奇点大会12国政策白皮书对比分析
  • 逆向思维养成:像侦探一样用OllyDbg分析软件注册逻辑(以GetWindowTextA为例)
  • 因果推断实战:从理论到三大核心方法解析
  • Linux输入子系统:从struct input_event到实战设备事件捕获与解析
  • VAP动画播放器:跨平台特效动画的终极解决方案
  • WebPlotDigitizer:从图表图像提取数据的完整指南与实用技巧
  • 2026 EB-5移民公司推荐:专业机构选择参考 - 品牌排行榜
  • 【AGI时代HR生存法则】:3个月内完成岗位能力图谱AI化升级的9个关键动作
  • 告别手动保存:Photoshop图层批量导出终极指南
  • Python SQLite3实战:用execute和executemany高效插入数据(从单条到批量操作指南)
  • Mac M1 部署 ModelScope:从环境配置到首个CV/NLP任务实战
  • 用TensorFlow 2.x和VGG16主干,从零训练一个Unet模型识别医学影像(附完整代码)
  • SAP MIRO发票校验合并后,标准报表查不到数据了怎么办?聊聊OBCY配置的副作用与应对
  • 2026年04月蒸压釜品牌口碑大比拼,这些品牌值得一看,蒸汽加热窗帘定型机/脱泡罐/木材染色罐,蒸压釜厂家哪家强 - 品牌推荐师
  • 从Simulink模型到可综合的Verilog:一个完整DSP模块的HDL代码生成实战
  • PyTorch、CUDA与驱动版本匹配实战:从查询到安装的避坑指南
  • 【SAP ABAP】从RFC到RESTful:实战构建SAP数据接口服务的完整指南
  • 免费开源的终极UTAU编辑器:OpenUtau让你的虚拟歌手创作变得简单高效
  • 从PWM到精准控制:180度与270度舵机的定时器中断驱动实践
  • “AGI不是替代预报员,而是赋予其超感知能力”——SITS2026首席科学家首次公开12项人机协同预警操作SOP(含真实灾情复盘录像权限申请通道)
  • AGI能源账本正在失控:92%的企业尚未监控推理PUE(Power Usage Effectiveness),这份SITS2026诊断工具包限时开放
  • 5分钟搞定淘宝日常任务:淘金币自动化脚本全攻略
  • DolphinDB 实战:构建批流一体的 Alpha 因子计算平台
  • 可观测性Observability三大支柱:指标Metrics、日志Logs、追踪Trace介绍(通过系统外部输出,推断系统内部状态能力)全链路路径、Span跨度、OpenTelemetry、性能监控
  • 别再用STM32硬刚了!用这块8位单片机APM飞控,低成本搞定无人机/车/船全系开发
  • 别再让大查询拖垮你的Java服务:实测MySQL流式查询与游标查询的内存救星方案
  • 【2026年最新600套毕设项目分享】基于微信小程序的书橱(30110)
  • 提升Python编程水平必不可少的重构技巧
  • AGI时代用户洞察如何重构?:SITS2026核心演讲中未公开的5个实证模型首次披露
  • 从零开始:使用nuscenes-mini数据集运行MapTRv2预测的完整流程