学习sa-token权限校验
(记录在毕设中的使用)
1、编程式权限认证
1、新建一个类AuthManager
也就是官网中的自定义权限加载接口实现类,然后重写两个方法
具体在两个方法里面写获取权限列表和角色列表
▼java复制代码@Component public class AuthManager implements StpInterface { @Override public List<String> getPermissionList(Object loginId, String loginType){ return null; } @Override public List<String> getRoleList(Object loginId, String loginType){ return null; } }
2、写具体的获取权限列表的业务代码
1、这里传递过来的两个参数我没有用
2、直接在getLoginUser()里面直接使用 StpUtil.getLoginIdAsLong() 来获取当前登录用户的id,进而获取当前登录用户
3、根据当前登录用户的角色获取他所拥有的权限。(本系统中不存在一个用户有多个角色的可能(所以查询简单了一点))
▼java复制代码/** * 返回一个账号 根据角色获取权限列表(返回权限的名称) */ @Override public List<String> getPermissionList(Object loginId, String loginType) { User user = userService.getLoginUser(); return rolePermissionsService.getPermissionsNameByRole(user.getRoleId()); }
3、在业务逻辑中使用
直接使用 StpUtil.hasPermission("user.add") ,它的返回值是一个布尔值,所以再结合 ThrowUtils 就能在业务逻辑中判断是否拥有某个权限
▼java复制代码/** * 手动添加用户 * @param userAddRequest * @return */ @PostMapping("/add") public BaseResponse<Long> addUser(@RequestBody UserAddRequest userAddRequest){ if(userAddRequest == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } //测试sa-token权限校验 ThrowUtils.throwIf(!StpUtil.hasPermission("user.add"),ErrorCode.NO_AUTH_ERROR); return ResultUtils.success(userService.addUser(userAddRequest)); }
2、注解式鉴权
使用 Sa-Token 的注解式鉴权(如 @SaCheckLogin、@SaCheckPermission)时,必须实现 StpInterface 接口,否则权限验证逻辑无法生效。
1、添加一个配置项拦截器(参考鱼皮和官网的)
▼java复制代码@Configuration public class SaTokenConfig implements WebMvcConfigurer { //注册Sa-Token拦截器,打开注解式鉴权功能 @Override public void addInterceptors(InterceptorRegistry registry) { // 注册 Sa-Token 拦截器,打开注解式鉴权功能 registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**"); } @PostConstruct public void rewriteSaStrategy() { // 重写Sa-Token的注解处理器,增加注解合并功能 SaAnnotationStrategy.instance.getAnnotation = AnnotatedElementUtils::getMergedAnnotation; } }
2、然后就可以向官网一样直接写在方法或者类上
3、如果校验不通过,根据报错信息添加一种全局异常处理
在globalExceptionHandler中添加
▼java复制代码@ExceptionHandler(NotLoginException.class) public BaseResponse<?> notLoginExceptionHandler(NotLoginException e){ log.error("NotLoginException", e); return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "操作失败,未登录"); }
真的好方便!!!爱了😍
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
Day 25✅ 今天做了:1、扇贝英语单词打卡2、英语听说读写、听力练习3、微信阅读15分钟4、编程导航学习⏰ 明天计划:待定📚 今日感悟:Keep going!
2
Day 104✅ 今天做了:学习了Java反射及快速入门⏰ 明天计划:继续学习Java反射
1
Day 26✅ 今天做了:1、扇贝英语单词打卡2、英语听说读写、听力练习3、微信阅读15分钟4、编程导航学习5、阅读 AI Agent 文献⏰ 明天计划:待定📚 今日感悟:Keep going!
1
Day 20✅ 今天做了:梳理昨天MCP的问题,AI面试120,AI智能体构建⏰ 明天计划:继续AI智能体构建📚 今日感悟:感觉AI面试120熟悉了不少,结合实操来理解记忆更深刻
0
Day 105✅ 今天做了:学习了Java反射原理图和反射相关类⏰ 明天计划:继续学习Java反射
0
作者分享
求助求助,服务器带宽20M,为什么上传文件这个服务上传一个9MB的文件要上传三分钟,看了网关和后端没有文件上传限制,现在也没有人用服务器。还有什么改配置的地方吗?
2
打卡第30天
1.学习RAG的整个流程,安装pgvector
2.学习rust web项目,请求和访问的相关内容
3.看软考半个小时
明天回学校演示毕业设计,赶路的一天呢
2
打卡第29天
1.在阿里云服务器构建公司项目所需环境
(花老板的hhhh)
2.软考操作系统和计算机网络部分网课
3.尝试在rust语言与AI对话,并流式接受返回值(还没成功🫠)
4
打卡第28天
1.学习软考数据结构与算法的章节
2.在阿里云尝试负载均衡+伸缩组+ECS等部署项目(项目可以通过负载均衡进行正常访问,但是进不去宝塔面板(明天看看))
2
打卡第27天
1.今天看了三道AI项目面试题
2.看了软考数据结构百分之四十
3.突然转到一个新的项目组,了解了一下整体架构,看了项目的设计文档
2
