『博客开发日记-后台』之为所有应该加上权限标识的接口加上对应的权限标识

本文最后更新于 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
{
/**
* 判断当前用户是否具有permission
* @param permission 要判断的权限
* @return
*/
public boolean hasPermission(String permission){
//如果是超级管理员 直接返回true
if(SecurityUtils.isAdmin()){
return true;
}
//否则 获取当前登录用户所具有的权限列表 如何判断是否存在permission
List<String> permissions =
SecurityUtils.getLoginUser().getPermissions();
return permissions.contains(permission);
}
}

在 LoginUser 中添加

1
2
3
4
5
6
7
8
/**
* 当前用户拥有的权限标识,例如 sys:user:list
*/
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/


『博客开发日记-后台』之为所有应该加上权限标识的接口加上对应的权限标识
http://example.com/2026/05/20/『博客开发日记-后台』之为所有应该加上权限标识的接口加上对应的权限标识/
作者
云梦泽
发布于
2026年5月20日
更新于
2026年5月20日
许可协议