Browse Source
feat(security): 添加用户特殊权限管理功能
feat(security): 添加用户特殊权限管理功能
- 新增 SpecialSecurityController 提供用户特殊权限的增删改查接口 - 创建 SysSpecialPermissionDefEntity 和 SysSpecialPermissionUserEntity 实体类 - 实现 SysSpecialPermissionService 接口及具体业务逻辑 - 添加 UserSpecialSecurity 相关的 DTO 和 VO 数据传输对象 - 集成 MyBatis Plus 实现数据库操作 - 支持权限定义清单的维护和用户权限的覆盖设置master
10 changed files with 372 additions and 0 deletions
-
55src/main/java/com/xujie/modules/sys/controller/SpecialSecurityController.java
-
9src/main/java/com/xujie/modules/sys/dao/SysSpecialPermissionDefDao.java
-
9src/main/java/com/xujie/modules/sys/dao/SysSpecialPermissionUserDao.java
-
12src/main/java/com/xujie/modules/sys/dto/UserSpecialSecurityItemDTO.java
-
21src/main/java/com/xujie/modules/sys/dto/UserSpecialSecurityRowVO.java
-
13src/main/java/com/xujie/modules/sys/dto/UserSpecialSecurityUpdateRequest.java
-
35src/main/java/com/xujie/modules/sys/entity/SysSpecialPermissionDefEntity.java
-
25src/main/java/com/xujie/modules/sys/entity/SysSpecialPermissionUserEntity.java
-
19src/main/java/com/xujie/modules/sys/service/SysSpecialPermissionService.java
-
174src/main/java/com/xujie/modules/sys/service/impl/SysSpecialPermissionServiceImpl.java
@ -0,0 +1,55 @@ |
|||||
|
package com.xujie.modules.sys.controller; |
||||
|
|
||||
|
import com.xujie.common.utils.R; |
||||
|
import com.xujie.modules.sys.dto.UserSpecialSecurityRowVO; |
||||
|
import com.xujie.modules.sys.dto.UserSpecialSecurityUpdateRequest; |
||||
|
import com.xujie.modules.sys.entity.SysSpecialPermissionDefEntity; |
||||
|
import com.xujie.modules.sys.service.SysSpecialPermissionService; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
|
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* 用户特殊权限(定义表 + 用户覆盖表) |
||||
|
*/ |
||||
|
@RestController |
||||
|
@RequestMapping("/specialSecurity") |
||||
|
public class SpecialSecurityController { |
||||
|
|
||||
|
@Autowired |
||||
|
private SysSpecialPermissionService specialPermissionService; |
||||
|
|
||||
|
@GetMapping("/getUserSpecialSecurity/{username}") |
||||
|
public R getUserSpecialSecurity(@PathVariable("username") String username) { |
||||
|
List<UserSpecialSecurityRowVO> list = specialPermissionService.listMergedForUser(username); |
||||
|
return R.ok().put("list", list); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 维护权限定义清单(不存在则新增,存在则更新) |
||||
|
*/ |
||||
|
@PostMapping("/saveUserSpecialSecurity") |
||||
|
public R saveUserSpecialSecurity(@RequestBody List<SysSpecialPermissionDefEntity> defs) { |
||||
|
specialPermissionService.saveOrUpdateDefinitions(defs); |
||||
|
return R.ok("保存成功"); |
||||
|
} |
||||
|
|
||||
|
@PostMapping("/updateUserSpecialSecurity") |
||||
|
public R updateUserSpecialSecurity(@RequestBody UserSpecialSecurityUpdateRequest request) { |
||||
|
specialPermissionService.updateUserPermissions(request); |
||||
|
return R.ok("保存成功"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 按用户名 + 权限号查询最终生效值:USER 为用户表,DEFAULT 为定义表默认,NONE 为无 |
||||
|
*/ |
||||
|
@GetMapping("/getPermissionValue") |
||||
|
public R getPermissionValue( |
||||
|
@RequestParam("username") String username, |
||||
|
@RequestParam("permissionCode") String permissionCode) { |
||||
|
Map<String, Object> map = specialPermissionService.getPermissionValue(username, permissionCode); |
||||
|
return R.ok().put("value", map.get("value")).put("source", map.get("source")); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
package com.xujie.modules.sys.dao; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
import com.xujie.modules.sys.entity.SysSpecialPermissionDefEntity; |
||||
|
import org.apache.ibatis.annotations.Mapper; |
||||
|
|
||||
|
@Mapper |
||||
|
public interface SysSpecialPermissionDefDao extends BaseMapper<SysSpecialPermissionDefEntity> { |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
package com.xujie.modules.sys.dao; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
import com.xujie.modules.sys.entity.SysSpecialPermissionUserEntity; |
||||
|
import org.apache.ibatis.annotations.Mapper; |
||||
|
|
||||
|
@Mapper |
||||
|
public interface SysSpecialPermissionUserDao extends BaseMapper<SysSpecialPermissionUserEntity> { |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
package com.xujie.modules.sys.dto; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
@Data |
||||
|
public class UserSpecialSecurityItemDTO { |
||||
|
|
||||
|
private String permissionCode; |
||||
|
|
||||
|
/** Y / N */ |
||||
|
private String itemvalue; |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
package com.xujie.modules.sys.dto; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* 用户特殊权限弹窗行(与 user.vue 表格字段对齐) |
||||
|
*/ |
||||
|
@Data |
||||
|
public class UserSpecialSecurityRowVO { |
||||
|
|
||||
|
private String permissionCode; |
||||
|
|
||||
|
/** 参数描述 */ |
||||
|
private String securitydesc; |
||||
|
|
||||
|
/** 模块 */ |
||||
|
private String module; |
||||
|
|
||||
|
/** 参数值(布尔,前端 checkbox) */ |
||||
|
private Boolean itemvalue; |
||||
|
} |
||||
@ -0,0 +1,13 @@ |
|||||
|
package com.xujie.modules.sys.dto; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
@Data |
||||
|
public class UserSpecialSecurityUpdateRequest { |
||||
|
|
||||
|
private String username; |
||||
|
|
||||
|
private List<UserSpecialSecurityItemDTO> items; |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
package com.xujie.modules.sys.entity; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* 特殊权限定义(默认清单) |
||||
|
*/ |
||||
|
@Data |
||||
|
@TableName("sys_special_permission_def") |
||||
|
public class SysSpecialPermissionDefEntity { |
||||
|
|
||||
|
@TableId(value = "permission_code", type = IdType.INPUT) |
||||
|
private String permissionCode; |
||||
|
|
||||
|
private String permissionName; |
||||
|
|
||||
|
private String moduleCode; |
||||
|
|
||||
|
private String defaultValue; |
||||
|
|
||||
|
/** |
||||
|
* 值类型(与库列 MS_Description 一致):0=Y/N;1=字符串;2=整数;3=小数 |
||||
|
*/ |
||||
|
private Integer valueType; |
||||
|
|
||||
|
private Integer sortOrder; |
||||
|
|
||||
|
/** 是否启用本权限定义:Y/N,默认 Y */ |
||||
|
private String active; |
||||
|
|
||||
|
private String remark; |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
package com.xujie.modules.sys.entity; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||
|
import com.baomidou.mybatisplus.annotation.TableField; |
||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* 用户特殊权限(覆盖默认值) |
||||
|
*/ |
||||
|
@Data |
||||
|
@TableName("sys_special_permission_user") |
||||
|
public class SysSpecialPermissionUserEntity { |
||||
|
|
||||
|
@TableId(type = IdType.AUTO) |
||||
|
private Long id; |
||||
|
|
||||
|
private String username; |
||||
|
|
||||
|
private String permissionCode; |
||||
|
|
||||
|
@TableField("[value]") |
||||
|
private String value; |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
package com.xujie.modules.sys.service; |
||||
|
|
||||
|
import com.xujie.modules.sys.dto.UserSpecialSecurityRowVO; |
||||
|
import com.xujie.modules.sys.dto.UserSpecialSecurityUpdateRequest; |
||||
|
import com.xujie.modules.sys.entity.SysSpecialPermissionDefEntity; |
||||
|
|
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
public interface SysSpecialPermissionService { |
||||
|
|
||||
|
List<UserSpecialSecurityRowVO> listMergedForUser(String username); |
||||
|
|
||||
|
void updateUserPermissions(UserSpecialSecurityUpdateRequest request); |
||||
|
|
||||
|
void saveOrUpdateDefinitions(List<SysSpecialPermissionDefEntity> defs); |
||||
|
|
||||
|
Map<String, Object> getPermissionValue(String username, String permissionCode); |
||||
|
} |
||||
@ -0,0 +1,174 @@ |
|||||
|
package com.xujie.modules.sys.service.impl; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||
|
import com.xujie.modules.sys.dao.SysSpecialPermissionDefDao; |
||||
|
import com.xujie.modules.sys.dao.SysSpecialPermissionUserDao; |
||||
|
import com.xujie.modules.sys.dto.UserSpecialSecurityItemDTO; |
||||
|
import com.xujie.modules.sys.dto.UserSpecialSecurityRowVO; |
||||
|
import com.xujie.modules.sys.dto.UserSpecialSecurityUpdateRequest; |
||||
|
import com.xujie.modules.sys.entity.SysSpecialPermissionDefEntity; |
||||
|
import com.xujie.modules.sys.entity.SysSpecialPermissionUserEntity; |
||||
|
import com.xujie.modules.sys.service.SysSpecialPermissionService; |
||||
|
import org.apache.commons.lang.StringUtils; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import org.springframework.transaction.annotation.Transactional; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
@Service |
||||
|
public class SysSpecialPermissionServiceImpl implements SysSpecialPermissionService { |
||||
|
|
||||
|
@Autowired |
||||
|
private SysSpecialPermissionDefDao defDao; |
||||
|
|
||||
|
@Autowired |
||||
|
private SysSpecialPermissionUserDao userDao; |
||||
|
|
||||
|
@Override |
||||
|
public List<UserSpecialSecurityRowVO> listMergedForUser(String username) { |
||||
|
List<SysSpecialPermissionDefEntity> defs = defDao.selectList( |
||||
|
new QueryWrapper<SysSpecialPermissionDefEntity>() |
||||
|
.eq("active", "Y") |
||||
|
.orderByAsc("sort_order") |
||||
|
.orderByAsc("permission_code")); |
||||
|
if (defs.isEmpty()) { |
||||
|
return new ArrayList<>(); |
||||
|
} |
||||
|
List<SysSpecialPermissionUserEntity> userRows = userDao.selectList( |
||||
|
new QueryWrapper<SysSpecialPermissionUserEntity>().eq("username", username)); |
||||
|
Map<String, String> override = userRows.stream() |
||||
|
.collect(Collectors.toMap( |
||||
|
SysSpecialPermissionUserEntity::getPermissionCode, |
||||
|
SysSpecialPermissionUserEntity::getValue, |
||||
|
(a, b) -> a)); |
||||
|
List<UserSpecialSecurityRowVO> result = new ArrayList<>(); |
||||
|
for (SysSpecialPermissionDefEntity d : defs) { |
||||
|
UserSpecialSecurityRowVO vo = new UserSpecialSecurityRowVO(); |
||||
|
vo.setPermissionCode(d.getPermissionCode()); |
||||
|
vo.setSecuritydesc(d.getPermissionName()); |
||||
|
vo.setModule(d.getModuleCode()); |
||||
|
String raw = override.get(d.getPermissionCode()); |
||||
|
if (raw == null) { |
||||
|
raw = d.getDefaultValue(); |
||||
|
} |
||||
|
vo.setItemvalue(isTruthy(raw)); |
||||
|
result.add(vo); |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
private static boolean isTruthy(String v) { |
||||
|
if (v == null) { |
||||
|
return false; |
||||
|
} |
||||
|
String s = v.trim(); |
||||
|
return "Y".equalsIgnoreCase(s) || "1".equals(s) || "true".equalsIgnoreCase(s); |
||||
|
} |
||||
|
|
||||
|
/** 定义是否参与默认/列表:active 为 Y(忽略大小写) */ |
||||
|
private static boolean isActiveY(String active) { |
||||
|
return active != null && "Y".equalsIgnoreCase(active.trim()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
@Transactional(rollbackFor = Exception.class) |
||||
|
public void updateUserPermissions(UserSpecialSecurityUpdateRequest request) { |
||||
|
if (request == null || StringUtils.isBlank(request.getUsername())) { |
||||
|
throw new IllegalArgumentException("username 不能为空"); |
||||
|
} |
||||
|
List<UserSpecialSecurityItemDTO> items = request.getItems(); |
||||
|
if (items == null || items.isEmpty()) { |
||||
|
throw new IllegalArgumentException("权限项不能为空"); |
||||
|
} |
||||
|
String username = request.getUsername().trim(); |
||||
|
userDao.delete(new QueryWrapper<SysSpecialPermissionUserEntity>().eq("username", username)); |
||||
|
for (UserSpecialSecurityItemDTO item : items) { |
||||
|
if (item == null || StringUtils.isBlank(item.getPermissionCode())) { |
||||
|
continue; |
||||
|
} |
||||
|
String val = normalizeItemValue(item.getItemvalue()); |
||||
|
SysSpecialPermissionUserEntity row = new SysSpecialPermissionUserEntity(); |
||||
|
row.setUsername(username); |
||||
|
row.setPermissionCode(item.getPermissionCode().trim()); |
||||
|
row.setValue(val); |
||||
|
userDao.insert(row); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static String normalizeItemValue(String itemvalue) { |
||||
|
if (itemvalue == null || itemvalue.trim().isEmpty()) { |
||||
|
return "N"; |
||||
|
} |
||||
|
String v = itemvalue.trim(); |
||||
|
if (isTruthy(v)) { |
||||
|
return "Y"; |
||||
|
} |
||||
|
return "N"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
@Transactional(rollbackFor = Exception.class) |
||||
|
public void saveOrUpdateDefinitions(List<SysSpecialPermissionDefEntity> defs) { |
||||
|
if (defs == null || defs.isEmpty()) { |
||||
|
return; |
||||
|
} |
||||
|
for (SysSpecialPermissionDefEntity def : defs) { |
||||
|
if (def == null || StringUtils.isBlank(def.getPermissionCode())) { |
||||
|
continue; |
||||
|
} |
||||
|
SysSpecialPermissionDefEntity existing = defDao.selectById(def.getPermissionCode()); |
||||
|
if (existing == null) { |
||||
|
if (StringUtils.isBlank(def.getActive())) { |
||||
|
def.setActive("Y"); |
||||
|
} else { |
||||
|
def.setActive("Y".equalsIgnoreCase(def.getActive().trim()) ? "Y" : "N"); |
||||
|
} |
||||
|
if (def.getValueType() == null) { |
||||
|
def.setValueType(0); |
||||
|
} |
||||
|
if (def.getSortOrder() == null) { |
||||
|
def.setSortOrder(0); |
||||
|
} |
||||
|
if (StringUtils.isBlank(def.getDefaultValue())) { |
||||
|
def.setDefaultValue("N"); |
||||
|
} |
||||
|
defDao.insert(def); |
||||
|
} else { |
||||
|
defDao.updateById(def); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Map<String, Object> getPermissionValue(String username, String permissionCode) { |
||||
|
Map<String, Object> m = new HashMap<>(4); |
||||
|
if (StringUtils.isBlank(username) || StringUtils.isBlank(permissionCode)) { |
||||
|
m.put("value", null); |
||||
|
m.put("source", "NONE"); |
||||
|
return m; |
||||
|
} |
||||
|
SysSpecialPermissionUserEntity u = userDao.selectOne( |
||||
|
new QueryWrapper<SysSpecialPermissionUserEntity>() |
||||
|
.eq("username", username.trim()) |
||||
|
.eq("permission_code", permissionCode.trim())); |
||||
|
if (u != null) { |
||||
|
m.put("value", u.getValue()); |
||||
|
m.put("source", "USER"); |
||||
|
return m; |
||||
|
} |
||||
|
SysSpecialPermissionDefEntity d = defDao.selectById(permissionCode.trim()); |
||||
|
if (d != null && isActiveY(d.getActive())) { |
||||
|
m.put("value", d.getDefaultValue()); |
||||
|
m.put("source", "DEFAULT"); |
||||
|
return m; |
||||
|
} |
||||
|
m.put("value", null); |
||||
|
m.put("source", "NONE"); |
||||
|
return m; |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue