本文最后更新于 2026年5月20日 晚上
为所有应该加上权限标识的接口加上对应的权限标识
前言
在后台管理系统中
有一些权限是特定用户才能使用的
比如一些文章编辑
这些是博主才可以使用而游客不能使用的
所以有必要给这些接口添加上权限验证
需要注意的是
在前端中有很多按钮都是有权限标识的
但不是所有按钮都会调用后端接口的
所以这些按钮的权限标识就不许要在后端添加上
只需要对有调用后端接口的按钮的权限标识添加上就好了
代码实现
在后台的 SecurityConfig 里添加上注解
创建 PermissionService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Service("ps") public class PermissionService {
public boolean hasPermission(String permission){ if(SecurityUtils.isAdmin()){ return true; } List<String> permissions = SecurityUtils.getLoginUser().getPermissions(); return permissions.contains(permission); } }
|
在 LoginUser 中添加
1 2 3 4 5 6 7 8
|
private List<String> permissions;
public LoginUser(SysUser sysUser) { this.sysUser = sysUser; }
|
然后在后台需要加的接口中加上注解和权限标识
需要注意的是,在添加文章中有两个权限公用一个接口的情况,需要这样处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @PostMapping @SystemLog(businessName = "新增文章") @ApiOperation(value = "新增文章接口", notes = "新增文章(保存草稿或发布文章)", response = String.class) public ResponseResult addPosts(@Valid @RequestBody AddPostsDto postsDto) { if (SystemConstants.ARTICLE_STATUS_NORMAL.equals(postsDto.getStatus())) { if (!permissionService.hasPermission("blog:post:publish")) { return ResponseResult.errorResult(403, "你没有发布文章的权限"); } } else if (SystemConstants.ARTICLE_STATUS_DRAFT.equals(postsDto.getStatus())) { if (!permissionService.hasPermission("blog:post:save")) { return ResponseResult.errorResult(403, "你没有保存草稿的权限"); } } else { return ResponseResult.errorResult(400, "文章状态参数错误"); }
return adminPostsService.addPosts(postsDto); }
|
在 UserDetailServiceImpl 中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| @Service public class UserDetailServiceImpl implements UserDetailsService {
@Autowired private SysUserMapper sysUserMapper; @Autowired private SysMenuMapper sysMenuMapper;
@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysUser::getUsername, username); SysUser sysUser = sysUserMapper.selectOne(queryWrapper); if (Objects.isNull(sysUser)){ throw new RuntimeException("用户不存在"); }
LoginUser loginUser = new LoginUser(sysUser); List<String> permissions = sysMenuMapper.selectPermByUserId(sysUser.getId()); if (permissions == null || permissions.isEmpty()) { permissions = Collections.emptyList(); } loginUser.setPermissions(permissions); return loginUser; } }
|
在 GlobalExceptionHandler 中
1 2 3 4 5 6 7
| @ExceptionHandler(AccessDeniedException.class) public ResponseResult handleAccessDeniedException(AccessDeniedException exception) { log.warn("权限不足:{}", exception.getMessage()); return ResponseResult.errorResult(AppHttpCodeEnum.NO_OPERATOR_AUTH.getCode(), "你没有该操作权限"); }
|
PS:该系列只做为作者学习开发项目做的笔记用
不一定符合读者来学习,仅供参考
预告
后续会记录博客的开发过程
每次学习会做一份笔记来进行发表
“一花一世界,一叶一菩提”
版权所有 © 2026 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/