学习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、如果校验不通过,根据报错信息添加一种全局异常处理

image-20250401175206940.png 在globalExceptionHandler中添加
java
复制代码
@ExceptionHandler(NotLoginException.class) public BaseResponse<?> notLoginExceptionHandler(NotLoginException e){ log.error("NotLoginException", e); return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "操作失败,未登录"); }

真的好方便!!!爱了😍

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友0992
下载 APP