S-mall-ssm 方法级鉴权实战:自定义注解+拦截器实现四级权限完全隔离 📅 发布时间:2026/8/20 21:25:34 👁 浏览次数: S-mall-ssm 方法级鉴权实战自定义注解拦截器实现四级权限完全隔离【免费下载链接】S-mall-ssm小小商城系统JavaWEB项目基于SSM仿天猫页面功能齐全实现了自动处理关联查询的通用Mapper、抽象 BaseService 类、注解鉴权、参数注解校验等项目地址: https://gitcode.com/gh_mirrors/smal/S-mall-ssmS-mall-ssm 是一个基于 SSMSpring SpringMVC MyBatis的仿天猫小小商城系统它的方法级鉴权设计堪称教科书级范例仅用一枚自定义注解Auth加一个拦截器AuthInterceptor就实现了未登录、普通用户、管理员、超级管理员四级权限的完全隔离。本文将带你从零读懂这套注解鉴权方案学会如何在 Controller 上一行注解锁死敏感接口适合所有想为 JavaWeb 项目快速搭建权限体系的开发者。一张图看懂四级权限体系 S-mall-ssm 将系统用户划分为 4 个等级所有权限判断都基于这个枚举定义在 UserExtension.java 中等级枚举值数字权值说明L0unLogin0未登录游客只能浏览L1user1普通注册用户可购物下单L2admin2管理员可管理商品订单L3superAdmin3超级管理员拥有全部权限权限值越大级别越高访问某接口所需的最小权值由注解决定低于门槛一律拦截这就是四级权限完全隔离的底层逻辑。鉴权三件套注解 拦截器 权限枚举 整套方案只有 3 个核心文件却覆盖了从标注到拦截的完整链路。第一步定义四级权限枚举在UserExtension内部直接声明Group枚举四个值天然有序方便用ordinal()比较大小public enum Group { unLogin, user, admin, superAdmin; }第二步编写 Auth 自定义注解S-mall-ssm 的 Auth 注解 极其精简核心要点有三个Target同时允许加在类和方法上这是实现方法级鉴权的前提、Retention(RUNTIME)保证运行时可通过反射读取、Inherited让子类继承父类注解Retention(RetentionPolicy.RUNTIME) Target({METHOD, TYPE}) Inherited public interface Auth { User.Group value(); // 标注访问该接口的最低权限组 }第三步注册拦截器在 springMVC.xml 中把AuthInterceptor注册进 SpringMVC 拦截器链即可无需改动任何 Controllermvc:interceptors bean classtmall.interceptor.AuthInterceptor/ ... /mvc:interceptors类级 方法级两行注解完成权限隔离 这套方案最惊艳的地方在于用类级兜底 方法级覆盖的机制让代码变得极度整洁。实际项目中 OrderFrontController.java 和 AdminBaseController.java 都是这么用的。前台游客放行下单需登录FrontBaseController类级别标注Auth(User.Group.unLogin)即游客也能访问而订单控制器类级别标注Auth(User.Group.user)购物车、下单、支付、评价等所有接口瞬间全部变成需登录Auth(User.Group.user) // 类级整个控制器都要求登录 Controller RequestMapping(/) public class OrderFrontController extends FrontBaseController { ... }后台管理员与超级管理员彻底分权后台基类直接标注Auth(User.Group.superAdmin)所有后台控制器默认必须超级管理员才能访问而CategoryController、OrderController、ProductController等控制器则在类上标注Auth(User.Group.admin)把权限门槛降到管理员级别。前后台两套体系互不干扰权限完全隔离。方法级覆盖精细到单个接口方法上的注解会覆盖类上的注解这正是方法级鉴权的威力所在。比如UserFrontController中某些接口用Auth(User.Group.unLogin)单独放行实现登录页/注册页游客可访问的精细控制Auth(User.Group.unLogin) // 方法级单独放宽该接口 RequestMapping(login) public String login() { ... }拦截器内部一次请求如何被放行或拦截 ️所有魔法都在 AuthInterceptor.java 的preHandle方法里逻辑只有 4 步取注解分别读取方法上的Auth和类上的Auth方法优先算门槛用ordinal()得出该接口的最低权限值pageRate算用户从 Session 取出当前登录用户游客默认权值为 0对比放行pageRate userRate时拦截否则通过。// 方法注解覆盖类注解 int pageRate authInClass null ? 0 : authInClass.value().ordinal(); pageRate authInMethod null ? pageRate : authInMethod.value().ordinal(); // 未登录 → 重定向登录页已登录但权限不足 → 抛 AuthException if (pageRate userRate) { if (userRate 0) { response.sendRedirect(/login?refer/); return false; } throw new AuthException(您已登录但是没有权限访问这里); }未登录用户访问受限页面会被重定向到登录页登录后自动跳回原页面已登录但等级不够的用户则直接抛出AuthException由全局异常处理器统一兜底体验相当完整。实战扩展鉴权还能怎么玩 掌握了这套思路你可以很轻松地扩展它配合参数校验项目里 VerificationAspect.java 用 AOP 自动校验 Controller 参数是否为空Nullable注解豁免与鉴权拦截器一前一后形成先鉴权、再校验的双保险新增权限等级只需在Group枚举里加一个值所有判断自动生效细粒度数据隔离拦截器只控制能不能进同一权限内不同用户的数据隔离如只能操作自己的订单由checkUser()这类方法二次校验OrderFrontController.java 就是范例。S-mall-ssm 用最少的代码把方法级鉴权做到了声明式、零侵入、可继承、可覆盖无论是学习 SpringMVC 拦截器还是为项目搭建权限体系这份源码都值得你打开 AuthInterceptor.java 和 Auth.java 逐行研读相信你会收获满满。【免费下载链接】S-mall-ssm小小商城系统JavaWEB项目基于SSM仿天猫页面功能齐全实现了自动处理关联查询的通用Mapper、抽象 BaseService 类、注解鉴权、参数注解校验等项目地址: https://gitcode.com/gh_mirrors/smal/S-mall-ssm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考