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