refactor(permission): 优化文件权限校验及锁定逻辑
- 修改权限校验函数为返回布尔值,简化调用和异常处理逻辑 - 对无权限操作使用统一异常提示,明确提示无权限原因 - 在获取文件详情时添加锁定用户信息及编辑权限标记 - 避免锁定文件时重复提示锁定用户,区分当前用户和锁定用户 - 在文件视图对象中新增可编辑权限字段 canWrite,用于前端权限显示 - 统一权限校验逻辑,支持读写权限细粒度判断,提升代码清晰性和维护性
This commit is contained in:
parent
0cecd2e8d8
commit
0582451a99
|
|
@ -120,7 +120,7 @@ public class QmsFileControllerService {
|
||||||
|
|
||||||
// 校验权限
|
// 校验权限
|
||||||
Long userId = UserUtil.getUserId();
|
Long userId = UserUtil.getUserId();
|
||||||
checkFilePermission(request.getId(), userId, true);
|
VUtil.trueThrowBusinessError(!checkFilePermission(request.getId(), userId)).throwMessage("无权限修改此文件");
|
||||||
|
|
||||||
String operator = UserUtil.getUserName();
|
String operator = UserUtil.getUserName();
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
|
@ -154,7 +154,7 @@ public class QmsFileControllerService {
|
||||||
|
|
||||||
// 校验权限
|
// 校验权限
|
||||||
Long userId = UserUtil.getUserId();
|
Long userId = UserUtil.getUserId();
|
||||||
checkFilePermission(id, userId, true);
|
VUtil.trueThrowBusinessError(!checkFilePermission(id, userId)).throwMessage("无权限");
|
||||||
|
|
||||||
// 删除文件
|
// 删除文件
|
||||||
fileService.removeById(id);
|
fileService.removeById(id);
|
||||||
|
|
@ -222,9 +222,15 @@ public class QmsFileControllerService {
|
||||||
|
|
||||||
// 校验权限
|
// 校验权限
|
||||||
Long userId = UserUtil.getUserId();
|
Long userId = UserUtil.getUserId();
|
||||||
checkFilePermission(id, userId, false);
|
boolean permission = checkFilePermission(id, userId);
|
||||||
|
|
||||||
QmsFileVO vo = BeanUtil.copyProperties(file, QmsFileVO.class);
|
QmsFileVO vo = BeanUtil.copyProperties(file, QmsFileVO.class);
|
||||||
|
String key = StrUtil.format(LOCK_KEY, id);
|
||||||
|
Long lockedUserId = redisTemplate.opsForValue().get(key);
|
||||||
|
if (Objects.nonNull(lockedUserId)) {
|
||||||
|
permission = Objects.equals(lockedUserId, userId);
|
||||||
|
vo.setCurrentLockUserName(userService.getById(lockedUserId).getUserName());
|
||||||
|
}
|
||||||
|
vo.setCanWrite(permission);
|
||||||
|
|
||||||
// 获取分类名称
|
// 获取分类名称
|
||||||
QmsFileCategory category = categoryService.getById(file.getCategoryId());
|
QmsFileCategory category = categoryService.getById(file.getCategoryId());
|
||||||
|
|
@ -563,9 +569,9 @@ public class QmsFileControllerService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验文件权限
|
* 校验文件权限
|
||||||
* @param needWrite 是否需要写权限
|
* @return 是否有写入权限
|
||||||
*/
|
*/
|
||||||
private void checkFilePermission(Long fileId, Long userId, boolean needWrite) {
|
private boolean checkFilePermission(Long fileId, Long userId) {
|
||||||
QmsFile file = fileService.getById(fileId);
|
QmsFile file = fileService.getById(fileId);
|
||||||
if (file == null) {
|
if (file == null) {
|
||||||
throw new NflgException(STATE.BusinessError, "文件不存在");
|
throw new NflgException(STATE.BusinessError, "文件不存在");
|
||||||
|
|
@ -573,7 +579,7 @@ public class QmsFileControllerService {
|
||||||
|
|
||||||
// 文件创建者有权限
|
// 文件创建者有权限
|
||||||
if (Objects.equals(file.getCreateUserId(), userId)) {
|
if (Objects.equals(file.getCreateUserId(), userId)) {
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否是文件组员
|
// 检查是否是文件组员
|
||||||
|
|
@ -585,9 +591,7 @@ public class QmsFileControllerService {
|
||||||
|
|
||||||
if (member != null) {
|
if (member != null) {
|
||||||
// 有权限:只读(1) 或 读写(2)
|
// 有权限:只读(1) 或 读写(2)
|
||||||
if (!needWrite || member.getPermissionType() >= 2) {
|
return member.getPermissionType() == 2;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否是分类组员
|
// 检查是否是分类组员
|
||||||
|
|
@ -598,9 +602,7 @@ public class QmsFileControllerService {
|
||||||
.one();
|
.one();
|
||||||
|
|
||||||
if (categoryMember != null) {
|
if (categoryMember != null) {
|
||||||
if (!needWrite || categoryMember.getPermissionType() >= 2) {
|
return categoryMember.getPermissionType() == 2;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NflgException(STATE.BusinessError, "无权限操作此文件");
|
throw new NflgException(STATE.BusinessError, "无权限操作此文件");
|
||||||
|
|
@ -647,8 +649,10 @@ public class QmsFileControllerService {
|
||||||
if (Boolean.FALSE.equals(result)) {
|
if (Boolean.FALSE.equals(result)) {
|
||||||
Long lockedUserId = redisTemplate.opsForValue().get(key);
|
Long lockedUserId = redisTemplate.opsForValue().get(key);
|
||||||
if (lockedUserId != null) {
|
if (lockedUserId != null) {
|
||||||
User lockedUser = userService.getById(lockedUserId);
|
if (!Objects.equals(lockedUserId, currentUserId)) {
|
||||||
VUtil.trueThrowBusinessError(true).throwMessage("文件已被用户【" + lockedUser.getUserName() + "】锁定");
|
User lockedUser = userService.getById(lockedUserId);
|
||||||
|
VUtil.trueThrowBusinessError(true).throwMessage("文件已被用户【" + lockedUser.getUserName() + "】锁定");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// key 在两次 Redis 操作间隙恰好过期,仍属于锁定失败,需兜底报错
|
// key 在两次 Redis 操作间隙恰好过期,仍属于锁定失败,需兜底报错
|
||||||
VUtil.trueThrowBusinessError(true).throwMessage("文件已被锁定");
|
VUtil.trueThrowBusinessError(true).throwMessage("文件已被锁定");
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,11 @@ public class QmsFileVO {
|
||||||
*/
|
*/
|
||||||
private List<QmsFileMemberVO> members;
|
private List<QmsFileMemberVO> members;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否可以编辑
|
||||||
|
*/
|
||||||
|
private boolean canWrite;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当前锁定用户名称
|
* 当前锁定用户名称
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue