抽象类通过abstract方法强制子类实现docheckpermission(),配合final模板方法统一token解析、用户加载与异常处理,子类仅定制权限规则,确保鉴权逻辑不可绕过且高度复用。

在 Java 中,用抽象类实现统一鉴权校验框架的核心思路是:把“校验逻辑的共性”抽到抽象类中,把“校验规则的差异性”留给子类实现。这样既能复用前置检查(如 token 解析、基础参数非空)、统一异常处理和响应格式,又能灵活适配不同接口的权限要求(如角色校验、资源级权限、白名单绕过等)。
定义抽象鉴权模板类
创建一个抽象类(如 AbstractAuthHandler),封装通用流程:
- 统一解析请求头中的 token 或 sessionId
- 校验 token 是否过期、签名是否合法(调用公共 JWT 工具类)
- 加载当前用户主体(UserDetails)并设置到 ThreadLocal
- 调用抽象方法 doCheckPermission(),由子类实现具体权限判断逻辑
- 成功则放行;失败则抛出标准化异常(如 AuthException),由全局异常处理器统一返回 403 或自定义错误码
子类按场景定制鉴权规则
不同接口继承该抽象类,只关注“我需要什么权限”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- AdminOnlyAuthHandler:检查用户角色是否包含 "ADMIN"
- ResourceOwnerAuthHandler:从请求路径或 body 提取 resource ID,查 DB 确认当前用户是否为该资源拥有者
- PermissionCodeAuthHandler:校验用户是否拥有某个权限编码(如 "order:delete")——对接 RBAC 权限表
- 支持注解驱动:配合自定义注解(如 @RequireRole("USER"))+ AOP,在切面中自动选择对应子类实例执行校验
与 Spring Web 集成的关键点
不是每个 Controller 方法都手动 new Handler,而是借助 Spring 的扩展能力:
- 用 @ControllerAdvice + @ExceptionHandler 统一捕获 AuthException,返回 JSON 格式错误响应
- 写一个 AuthInterceptor,在 preHandle 中根据请求路径匹配预注册的 Handler Bean(可用 Map
管理) - 或者更轻量:在抽象类中定义静态工厂方法,根据注解类型返回对应子类实例,避免硬编码依赖
- 确保抽象类本身被 Spring 管理(加 @Component 或声明为 @Bean),子类也需注册为 Bean 才能注入使用
注意事项与增强建议
避免常见坑,让框架更健壮:
- token 解析和用户加载必须做 缓存(如 Caffeine),防止高频重复查库
- 敏感操作(如删除、支付)建议叠加二次验证(短信/滑块),抽象类可预留 needSecondaryVerify() 钩子方法
- 日志记录要脱敏:打印 “用户 XXX 尝试访问 /api/order/{id},鉴权失败”,不打 token 和密码
- 测试时用 @MockBean 替换真实 Handler,快速覆盖各种校验分支(如 token 过期、权限不足、用户不存在)
不复杂但容易忽略:抽象类里别写业务 Service 调用,只做鉴权相关;真正的用户数据查询、权限判定应交给已有的 UserService 或 PermissionService —— 抽象类负责编排,不负责实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










