fix: 79534 【水平越权】企业标准 部分接口没有处理水平越权

This commit is contained in:
2024-01-30 17:56:44 +08:00
parent ade8374fd5
commit 8aab58761f
3 changed files with 119 additions and 6 deletions
@@ -10,34 +10,38 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* @author ThinkBook * @author ThinkBook
* @description 针对表【laws_enterprise_standard_temp_permission(企业标准)】的数据库操作Service * @description 针对表【laws_enterprise_standard_temp_permission(企业标准)】的数据库操作Service
* @createDate 2023-09-07 11:20:30 * @createDate 2023-09-07 11:20:30
*/ */
public interface EnterpriseStandardAuthUserService extends IService<EnterpriseStandardAuthUser> { public interface EnterpriseStandardAuthUserService extends IService<EnterpriseStandardAuthUser> {
void saveTempPermission(LawsStandardTempPermission lawsStandardTempPermission); void saveTempPermission(LawsStandardTempPermission lawsStandardTempPermission);
/** /**
* 不校验当前登陆人账号是否有权限 * 不校验当前登陆人账号是否有权限
*
* @param lawsStandardTempPermission * @param lawsStandardTempPermission
*/ */
void saveTempPermissionTwo(LawsStandardTempPermission lawsStandardTempPermission); void saveTempPermissionTwo(LawsStandardTempPermission lawsStandardTempPermission);
/** /**
* 查看详情权限设置 * 查看详情权限设置
*
* @param records * @param records
*/ */
void detailFlagSet(List<Map<String, Object>> records); void detailFlagSet(List<Map<String, Object>> records);
/** /**
* 编辑权限设置 * 编辑权限设置
*
* @param records * @param records
*/ */
void editFlagSet(List<Map<String, Object>> records); void editFlagSet(List<Map<String, Object>> records);
/** /**
* 删除权限设置 * 删除权限设置
*
* @param records * @param records
*/ */
void delFlagSet(List<Map<String, Object>> records); void delFlagSet(List<Map<String, Object>> records);
@@ -48,13 +52,15 @@ public interface EnterpriseStandardAuthUserService extends IService<EnterpriseSt
/** /**
* 企标编辑保存后 重置授权部门 * 企标编辑保存后 重置授权部门
*
* @param id * @param id
* @param string * @param string
*/ */
void resetAuthDept(String id,String string); void resetAuthDept(String id, String string);
/** /**
* 临时授权记录分页列表接口 * 临时授权记录分页列表接口
*
* @param tempAuthRecordQueryDto * @param tempAuthRecordQueryDto
* @param pageNo * @param pageNo
* @param pageSize * @param pageSize
@@ -64,9 +70,36 @@ public interface EnterpriseStandardAuthUserService extends IService<EnterpriseSt
/** /**
* 解除授权 * 解除授权
*
* @param authId * @param authId
*/ */
void revokeAuth(String authId); void revokeAuth(String authId);
boolean hasESAuth(String userId, List<String> standardIds); boolean hasESAuth(String userId, List<String> standardIds);
/**
* 指定用户Id是否有指定企标的删除权限
* @param standardId 企标Id
* @param userId 用户Id
*/
boolean hasDelAuth(String standardId, String userId);
/**
* 指定用户Id是否有指定企标的删除权限
* @param standardId 企标Id
* @param userId 用户Id
*/
boolean hasEditAuth(String standardId, String userId);
/**
* 编辑水平越权校验
* @param standardId 企标Id
*/
void isEditHorizontalOverstep(String standardId);
/**
* 删除水平越权校验
* @param standardId 企标Id
*/
void isDeleteHorizontalOverstep(String standardId);
} }
@@ -82,6 +82,9 @@ public class EnterpriseStandardAuthUserServiceImpl extends ServiceImpl<Enterpris
@Value("#{'${adminRoleCode}'.split(',')}") @Value("#{'${adminRoleCode}'.split(',')}")
private List<String> adminRoleCodeList; private List<String> adminRoleCodeList;
@Resource
private ILawsEnterpriseStandardService esService;
@Override @Override
public void saveTempPermission(LawsStandardTempPermission lawsStandardTempPermission) { public void saveTempPermission(LawsStandardTempPermission lawsStandardTempPermission) {
@@ -396,7 +399,7 @@ public class EnterpriseStandardAuthUserServiceImpl extends ServiceImpl<Enterpris
SysUser currentUser = sysUserService.getById(userId); SysUser currentUser = sysUserService.getById(userId);
String username = currentUser.getUsername(); String username = currentUser.getUsername();
// 获取当前用户的角色roleCode // 获取当前用户的角色roleCode
List<String> roleList = sysUserRoleService.getRole(currentUser.getUsername()); List<String> roleList = sysUserRoleService.getRole(username);
if (roleList != null && roleList.stream().anyMatch(adminRoleCodeList::contains)) { if (roleList != null && roleList.stream().anyMatch(adminRoleCodeList::contains)) {
records.forEach(kv -> kv.put(FieldCommon.EDIT_FLAG, true)); records.forEach(kv -> kv.put(FieldCommon.EDIT_FLAG, true));
return; return;
@@ -411,6 +414,79 @@ public class EnterpriseStandardAuthUserServiceImpl extends ServiceImpl<Enterpris
} }
} }
@Override
public boolean hasDelAuth(String standardId, String userId) {
SysUser currentUser = sysUserService.getById(userId);
String username = currentUser.getUsername();
LawsEnterpriseStandard es = enterpriseStandardService.getById(standardId);
Date currentDate = new Date();
// 获取当前用户的角色roleCode
List<String> roleList = sysUserRoleService.getRole(currentUser.getUsername());
// 管理员能够删除所有试用期的企标
if (roleList != null && roleList.stream().anyMatch(adminRoleCodeList::contains)) {
String tryFlag = es.getTryFlag();
if (tryFlag.equals(YesOrNoEnum.NO.getValue())) {
return false;
}
Date releaseDate = es.getReleaseDate();
int trialPeriodMonths = Integer.parseInt(es.getTrialPeriod()); // 将试用周期转换为天数
Calendar calendar = Calendar.getInstance();
calendar.setTime(releaseDate);
calendar.add(Calendar.MONTH, trialPeriodMonths); // 将试用周期加到发布日期上
Date trialEndDate = calendar.getTime(); // 获取试用期结束日期
// 在适用周期之内的可以删除
return tryFlag.equals(YesOrNoEnum.YES.getValue()) && currentDate.compareTo(trialEndDate) <= 0;
}
// 创建人只能删除自己的试用期的企标
String createBy = es.getCreateBy();
String tryFlag = es.getTryFlag();
if (tryFlag.equals(YesOrNoEnum.NO.getValue())) {
return false;
}
Date releaseDate = es.getReleaseDate();
int trialPeriodMonths = Integer.parseInt(es.getTrialPeriod()); // 将试用周期转换为天数
Calendar calendar = Calendar.getInstance();
calendar.setTime(releaseDate);
calendar.add(Calendar.MONTH, trialPeriodMonths); // 将试用周期加到发布日期上
Date trialEndDate = calendar.getTime(); // 获取试用期结束日期
return username.equals(createBy) && tryFlag.equals(YesOrNoEnum.YES.getValue())
&& currentDate.compareTo(trialEndDate) <= 0;
}
@Override
public boolean hasEditAuth(String standardId, String userId) {
SysUser user = sysUserService.getById(userId);
String username = user.getUsername();
// 获取当前用户的角色roleCode
List<String> roleList = sysUserRoleService.getRole(username);
if (roleList != null && roleList.stream().anyMatch(adminRoleCodeList::contains)) {
return true;
}
LawsEnterpriseStandard es = esService.getById(standardId);
String createBy = es.getCreateBy();
return username.equals(createBy);
}
@Override
public void isEditHorizontalOverstep(String standardId) {
if (hasEditAuth(standardId, UserUtils.getUserId())) {
return;
}
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.YOU_HAVE_NOT_DATA_AUTH, standardId));
}
@Override
public void isDeleteHorizontalOverstep(String standardId) {
if (hasDelAuth(standardId, UserUtils.getUserId())) {
return;
}
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.YOU_HAVE_NOT_DATA_AUTH, standardId));
}
@Override @Override
public void delFlagSet(List<Map<String, Object>> records) { public void delFlagSet(List<Map<String, Object>> records) {
String userId = UserUtils.getUserId(); String userId = UserUtils.getUserId();
@@ -123,6 +123,8 @@ public class LawsEnterpriseController {
@ApiOperationSupport(order = 4) @ApiOperationSupport(order = 4)
@RequiresPermissions("enterpriseStandard:edit") @RequiresPermissions("enterpriseStandard:edit")
public Result<String> commonEdit(@RequestBody @ApiParam("标签管理") Map<String,Object> parameterMap) { public Result<String> commonEdit(@RequestBody @ApiParam("标签管理") Map<String,Object> parameterMap) {
// 水平越权校验
esAuthUserService.isEditHorizontalOverstep((String) parameterMap.get("id"));
parameterMap.put(FieldCommon.MODULE, MODULE_VALUE); parameterMap.put(FieldCommon.MODULE, MODULE_VALUE);
return Result.OK(lawsCommonService.commonEdit(parameterMap)); return Result.OK(lawsCommonService.commonEdit(parameterMap));
} }
@@ -192,6 +194,8 @@ public class LawsEnterpriseController {
@ApiOperationSupport(order = 9) @ApiOperationSupport(order = 9)
@RequiresPermissions("enterpriseStandard:delete") @RequiresPermissions("enterpriseStandard:delete")
public Result<String> singleDelete(@RequestBody @ApiParam(name = "ids", value = "主键(多个用逗号分隔)") Map<String,Object> parameterMap) { public Result<String> singleDelete(@RequestBody @ApiParam(name = "ids", value = "主键(多个用逗号分隔)") Map<String,Object> parameterMap) {
// 水平越权校验
esAuthUserService.isDeleteHorizontalOverstep((String) parameterMap.get("id"));
// 删除标准时同步删除这个标准的收藏数据 // 删除标准时同步删除这个标准的收藏数据
lawsStandardCollectionService.deleteByStandardId((String) parameterMap.get("ids")); lawsStandardCollectionService.deleteByStandardId((String) parameterMap.get("ids"));
lawsStandardSharingService.deleteByStandardId((String) parameterMap.get("ids")); lawsStandardSharingService.deleteByStandardId((String) parameterMap.get("ids"));