公告

记录一下自己学习和生活中的所见所闻

Skip to content

用户中心项目用户管理功能

  1. 查询用户​
    • 允许根据用户名查询​
  2. 删除用户

image.png

Java
@GetMapping("/search")​
public List<User> searchUsers(String username) {​
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();​
   if (StringUtils.isNotBlank(username)) {​
      queryWrapper.like("username", username);​
   }​
   return userService.list(queryWrapper);​
}

image.png

Java
@PostMapping("/delete")​
public boolean deleteUser(@RequestBody long id) {​
   if (id <= 0) {​
      return false;​
   }​
   return userService.removeById(id);​
}
  1. 问题:此时代码的接口是开放的,没有校验是否是管理员,任何人均可调用,不安全
  • 解决:增加一个用户角色的字段,进行身份校验​
  • 增加用户角色字段 image.png

image.png

image.png

使用 MyBatisX 插件重新生成代码,替换原来的 User.java 文件【替换后记得对 isDelete 字段添加 @TableLogic 注解】;mapper.xml 文件中记得引用 mapper 修改文件路径;

修改 UserServiceImpl 文件中用户脱敏的代码

image.png

修改 UserController 中的 getRole 为 getUserRole【下面完整代码是修改过的】

image.png

  • 将 UserServiceImpl 中的用户登录态键 提到 UserService 里 image.png
  1. 回到 UserController 编写鉴权逻辑 image.png
  2. 此时 需要将 1 定义为一个常量,所以新建一个常量(新建包 constant ,constant 下建立 UserConstant 接口),将 用户登陆态键 修改到这里

image.png

image.png

  1. 回到 UserController 修改鉴权逻辑的代码,继续优化

image.png

使用一个公共函数来表示是否是管理员

Java
@GetMapping("/search")​
public List<User> searchUsers(String username,HttpServletRequest request) {​
   if (!isAdmin(request)){​
      return null;​
   }​
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();​
   if (StringUtils.isNotBlank(username)) {​
      queryWrapper.like("username", username);​
   }​
   return userService.list(queryWrapper);​
}​

@PostMapping("/delete")​
public boolean deleteUser(@RequestBody long id,HttpServletRequest request) {​
   if (!isAdmin(request)){​
      return false;​
   }​
   if (id <= 0) {​
      return false;​
   }​
   return userService.removeById(id);​
}​

/**​
 * 是否为管理员​
 */
private boolean isAdmin(HttpServletRequest request){​
   //仅管理员可查询​
   Object userObj = request.getSession().getAttribute(USER_LOGIN_STATE);​
   User user = (User) userObj;​
   return user != null && user.getUserRole() == ADMIN_ROLE;​
}
  1. 修改 yml 配置文件,设置 session 失效时间 image.png

  2. 删除 target 文件,找到之前请求的历史,执行重置登录态,点击 F9 结束(或者取消断点)

image.png

image.png

  1. 点击下面图标,执行 GET 请求

image.png

image.png

  1. 执行成功,可以看到返回了数据库的数据,但返回的数据有点多

image.png

image.png

image.png

  1. 修改代码进行过滤 image.pngimage.png

  2. UserController 调用 getSafetyUser 方法修改返回数据信息 image.png 简化代码【两种方法:点击黄色灯泡;return 处Alt+Enter】

image.png

image.png

Java
@GetMapping("/search")​
public List<User> searchUsers(String username,HttpServletRequest request) {​
   if (!isAdmin(request)){​
      return null;​
   }​
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();​
   if (StringUtils.isNotBlank(username)) {​
      queryWrapper.like("username", username);​
   }​
   List<User> userList = userService.list(queryWrapper);​
   return userList.stream().map(user -> userService.getSafetyUser(user)).collect(Collectors.toList());​
}

::: danger⚠️写代码流程​

  • 先做设计​
  • 代码实现​
  • 持续优化!!!(复用代码、提取公共逻辑/常量) :::