用户中心项目用户管理功能
- 查询用户
- 允许根据用户名查询
- 删除用户
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);
}
Java
@PostMapping("/delete")
public boolean deleteUser(@RequestBody long id) {
if (id <= 0) {
return false;
}
return userService.removeById(id);
}
- 问题:此时代码的接口是开放的,没有校验是否是管理员,任何人均可调用,不安全
- 解决:增加一个用户角色的字段,进行身份校验
- 增加用户角色字段
使用 MyBatisX 插件重新生成代码,替换原来的 User.java 文件【替换后记得对 isDelete 字段添加 @TableLogic 注解】;mapper.xml 文件中记得引用 mapper 修改文件路径;
修改 UserServiceImpl 文件中用户脱敏的代码
修改 UserController 中的 getRole 为 getUserRole【下面完整代码是修改过的】
- 将 UserServiceImpl 中的用户登录态键 提到 UserService 里
- 回到 UserController 编写鉴权逻辑
- 此时 需要将 1 定义为一个常量,所以新建一个常量(新建包 constant ,constant 下建立 UserConstant 接口),将 用户登陆态键 修改到这里
- 回到 UserController 修改鉴权逻辑的代码,继续优化
使用一个公共函数来表示是否是管理员
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;
}
修改 yml 配置文件,设置 session 失效时间
删除 target 文件,找到之前请求的历史,执行重置登录态,点击 F9 结束(或者取消断点)
- 点击下面图标,执行 GET 请求
- 执行成功,可以看到返回了数据库的数据,但返回的数据有点多
修改代码进行过滤
UserController 调用 getSafetyUser 方法修改返回数据信息
简化代码【两种方法:点击黄色灯泡;return 处Alt+Enter】
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⚠️写代码流程
- 先做设计
- 代码实现
- 持续优化!!!(复用代码、提取公共逻辑/常量) :::