feat: ASW-21 用户权限查询接口接口开发

This commit is contained in:
zhangshuai
2024-08-01 17:09:29 +08:00
parent d9ec686bc7
commit 96483dc432
7 changed files with 204 additions and 54 deletions

View File

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.List;
@Data
@TableName("sys_role")
public class SysRoleEntity {
@@ -20,4 +22,8 @@ public class SysRoleEntity {
@TableField(exist = false)
private String[] menuIds;
private Long createTimestamp;
@TableField(exist = false)
private List<SysMenuEntity> menus;
@TableField(exist = false)
private List<String> buttons;
}

View File

@@ -15,13 +15,21 @@ public class SysUserEntity {
@TableId(type = IdType.ASSIGN_UUID)
private String id;
private String name;
@TableField("user_name")
private String userName;
private String pwd;
@TableField(exist = false)
private String roleIds;
@TableField(exist = false)
private List<SysRoleEntity> roles;
private String accessLevel;
private Long createTimestamp;
}

View File

@@ -1,7 +1,11 @@
package net.geedge.asw.module.sys.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.Pair;
import cn.hutool.core.map.MapUtil;
import cn.hutool.log.Log;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import net.geedge.asw.common.util.ASWException;
import net.geedge.asw.common.util.Constants;
@@ -13,9 +17,16 @@ import net.geedge.asw.module.sys.entity.SysMenuEntity;
import net.geedge.asw.module.sys.entity.SysRoleEntity;
import net.geedge.asw.module.sys.entity.SysUserEntity;
import net.geedge.asw.module.sys.service.ISysAuthService;
import net.geedge.asw.module.workbook.entity.WorkbookMemberEntity;
import net.geedge.asw.module.workbook.service.IWorkbookMemberService;
import net.geedge.asw.module.workspace.entity.WorkspaceEntity;
import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity;
import net.geedge.asw.module.workspace.service.IWorkspaceMemberService;
import net.geedge.asw.module.workspace.service.IWorkspaceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -23,57 +34,90 @@ import java.util.stream.Collectors;
@Service
public class SysAuthServiceImpl implements ISysAuthService {
private static final Log log = Log.get();
private static final Log log = Log.get();
@Autowired
private SysUserDao userDao;
@Autowired
private SysRoleDao roleDao;
@Autowired
private SysUserDao userDao;
@Override
public SysUserEntity login(String userName, String pwd) {
SysUserEntity userEntity = userDao
.selectOne(new QueryWrapper<SysUserEntity>().lambda().eq(SysUserEntity::getUserName, userName));
if (T.ObjectUtil.isNull(userEntity)
|| !T.StrUtil.equals(userEntity.getPwd(), T.AesUtil.encrypt(pwd, Constants.AES_KEY))) {
log.warn("user login error, username: {}", userName);
throw ASWException.builder().rcode(RCode.SYS_USER_PWD_ERROR).build();
}
StpUtil.login(userEntity.getId());
log.info("user login success, userName: {}", userName);
return userEntity;
}
@Autowired
private SysRoleDao roleDao;
@Override
public void logout() {
StpUtil.logout();
}
@Autowired
private IWorkspaceService workspaceService;
/**
* 获取登录用户权限
*/
@Override
public Map<String, Object> userPermissions() {
Map<String, Object> result = T.MapUtil.newHashMap();
String userId = StpUtil.getLoginIdAsString();
List<SysRoleEntity> roleList = roleDao.findRoleByUserId(userId);
result.put("roles", roleList);
// 组织 menu数据
List<SysMenuEntity> menuList = roleDao.findMenuByUserId(userId);
List<String> buttonList = menuList.stream().filter(menu -> T.StrUtil.equalsIgnoreCase(menu.getType(), "button"))
.map(menu -> menu.getName()).collect(Collectors.toList());
result.put("buttons", buttonList);
//生成 menu tree结构
Map<String, List<SysMenuEntity>> groupMap = menuList.stream()
.filter(menu -> T.StrUtil.equalsIgnoreCase(menu.getType(), "menu"))
.collect(Collectors.groupingBy(SysMenuEntity::getPid));
menuList.forEach(menu -> {
menu.setChildren(groupMap.get(menu.getId()));
});
List<SysMenuEntity> collect = menuList.stream().filter(menu -> T.StrUtil.isBlank(menu.getPid()))
.collect(Collectors.toList());
result.put("menus", collect);
return result;
}
@Autowired
private IWorkspaceMemberService workspaceMemberService;
@Override
public SysUserEntity login(String userName, String pwd) {
SysUserEntity userEntity = userDao
.selectOne(new QueryWrapper<SysUserEntity>().lambda().eq(SysUserEntity::getUserName, userName));
if (T.ObjectUtil.isNull(userEntity)
|| !T.StrUtil.equals(userEntity.getPwd(), T.AesUtil.encrypt(pwd, Constants.AES_KEY))) {
log.warn("user login error, username: {}", userName);
throw ASWException.builder().rcode(RCode.SYS_USER_PWD_ERROR).build();
}
StpUtil.login(userEntity.getId());
log.info("user login success, userName: {}", userName);
return userEntity;
}
@Override
public void logout() {
StpUtil.logout();
}
/**
* 获取登录用户权限
*/
@Override
public Map<String, Object> userPermissions() {
String userId = StpUtil.getLoginIdAsString();
SysUserEntity sysUserEntity = userDao.selectById(userId);
String accessLevel = sysUserEntity.getAccessLevel();
List<WorkspaceEntity> workspaceEntityList = workspaceService.list();
if (accessLevel.equalsIgnoreCase("regular")) {
List<WorkspaceMemberEntity> workbookMemberEntityList = workspaceMemberService.list(new LambdaQueryWrapper<WorkspaceMemberEntity>().eq(WorkspaceMemberEntity::getUserId, userId));
List<String> workspaceIdList = workbookMemberEntityList.stream().map(x -> x.getWorkspaceId()).toList();
workspaceEntityList = workspaceService.list(new LambdaQueryWrapper<WorkspaceEntity>().in(WorkspaceEntity::getId, workspaceIdList));
// public workspace
List<WorkspaceEntity> publicWorkspaces = workspaceService.list(new LambdaQueryWrapper<WorkspaceEntity>().eq(WorkspaceEntity::getVisibility, "public"));
workspaceEntityList.addAll(publicWorkspaces);
}
SysRoleEntity role = roleDao.findRoleByUserId(userId).get(0);
// 组织 button 数据
List<SysMenuEntity> menuList = roleDao.findMenuByUserId(userId);
List<String> buttonList = menuList.stream().filter(menu -> T.StrUtil.equalsIgnoreCase(menu.getType(), "button"))
.map(menu -> menu.getName()).collect(Collectors.toList());
role.setButtons(buttonList);
//生成 menu tree结构
Map<String, List<SysMenuEntity>> groupMap = menuList.stream()
.filter(menu -> !T.StrUtil.equalsIgnoreCase(menu.getPid(), "0"))
.collect(Collectors.groupingBy(SysMenuEntity::getPid));
menuList.forEach(menu -> {
menu.setChildren(groupMap.get(menu.getId()));
});
List<SysMenuEntity> collect = menuList.stream()
.filter(menu -> T.StrUtil.equals(menu.getPid(), "0"))
.filter(menu -> T.StrUtil.equals(menu.getType(), "menu"))
.collect(Collectors.toList());
role.setMenus(collect);
List records = ListUtil.list(false);
for (WorkspaceEntity workspace : workspaceEntityList) {
Map<Object, Object> map = MapUtil.builder()
.put("workspace", workspace)
.put("role", role)
.build();
records.add(map);
}
Map<String, Object> result = T.MapUtil.newHashMap();
result.put("records", records);
result.put("accessLevel", accessLevel);
return result;
}
}

View File

@@ -21,6 +21,5 @@ public class WorkspaceEntity {
private String createUserId;
private String updateUserId;
private String workspaceId;
}

View File

@@ -0,0 +1,37 @@
/**
* 重置 SYS_MENU 数据
*/
TRUNCATE sys_menu;
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('1000', 'workbooks', 'workbooks', '0', 'menu', '', '/workbooks', '', 0, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('1001', 'workbook_view', 'buttons.view', '1000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2000', 'applications', 'applications', '0', 'menu', '', '/applications', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2001', 'application_view', 'buttons.view', '2000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3000', 'pcaps', 'pcaps', '0', 'menu', '', '/pcaps', '', 2, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3001', 'pacp_view', 'buttons.view', '3000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3002', 'pacp_upload', 'buttons.upload', '3000', 'button', '', '', '', 2, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3003', 'pacp_delete', 'buttons.delete', '3000', 'button', '', '', '', 3, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3004', 'pacp_parse', 'buttons.parse', '3000', 'button', '', '', '', 4, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3005', 'pacp_analyze', 'buttons.analyze', '3000', 'button', '', '', '', 5, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('4000', 'signatures', 'signatures', '0', 'menu', '', '/signatures', '', 3, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('4001', 'signature_view', 'buttons.view', '4000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('5000', 'packages', 'packages', '0', 'menu', '', '/packages', '', 4, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('5001', 'package_view', 'buttons.view', '5000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6000', 'jobs', 'jobs', '0', 'menu', '', '/jobs', '', 5, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6001', 'job_view', 'buttons.view', '6000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6002', 'job_add', 'buttons.add', '6000', 'button', '', '', '', 2, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6003', 'job_delete', 'buttons.delete', '6000', 'button', '', '', '', 3, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('7000', 'playbooks', 'playbooks', '0', 'menu', '', '/playbooks', '', 6, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('7001', 'playbook_view', 'buttons.view', '7000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('8000', 'runners', 'runners', '0', 'menu', '', '/runners', '', 7, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('8001', 'runner_view', 'buttons.view', '8000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('1', 'workspace_add', 'buttons.add', '0', 'button', '', '', '', 1, 1722478572000, 1);

View File

@@ -0,0 +1,49 @@
/**
* 先清空 sys_role_menu 表中 admin&common 相关数据,再导入
*/
delete from sys_role_menu where role_id in ('admin' ,'common');
-- admin
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '1000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '1001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3002');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3003');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3004');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3005');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '4000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '4001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '5000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '5001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6002');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6003');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '7000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '7001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '8000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '8001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '1');
-- common
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '1001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '2001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '3001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '4001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '5001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '6001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '7001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '8001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '1');

View File

@@ -8,13 +8,14 @@ CREATE TABLE `sys_user` (
`name` varchar(255) NOT NULL,
`user_name` varchar(255) NOT NULL,
`pwd` varchar(255) NOT NULL,
`access_level` varchar(255) NOT NULL,
`create_timestamp` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_name` (`user_name`) USING BTREE,
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `sys_user`(`id`, `name`, `user_name`, `pwd`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'ad9d757e620d5d9cd8e32c3dbcf37525', UNIX_TIMESTAMP(NOW())*1000);
-- 添加内置用户
INSERT INTO `sys_user`(`id`, `name`, `user_name`, `pwd`, `access_level`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'ad9d757e620d5d9cd8e32c3dbcf37525', 'administrator', UNIX_TIMESTAMP(NOW())*1000);
/**
* 1、新增 sys_role 表
@@ -35,6 +36,10 @@ CREATE TABLE `sys_role` (
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 添加内置角色
INSERT INTO `sys_role` (`id`, `name`, `i18n`, `remark`, `build_in`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'admin', 1, UNIX_TIMESTAMP(NOW())*1000);
INSERT INTO `sys_role` (`id`, `name`, `i18n`, `remark`, `build_in`, `create_timestamp`) VALUES ('common', 'common', 'common', 'common', 1, UNIX_TIMESTAMP(NOW())*1000);
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
@@ -59,14 +64,14 @@ CREATE TABLE `sys_user_role` (
`role_id` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `sys_user_role`(`user_id`, `role_id`) VALUES ('admin', 'admin');
DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu` (
`menu_id` varchar(64) NOT NULL,
`role_id` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 添加内置角色
INSERT INTO `sys_role` (`id`, `name`, `i18n`, `remark`, `build_in`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'admin', 1, UNIX_TIMESTAMP(NOW())*1000);
/**
* 1、新增 sys_config 表
@@ -382,6 +387,8 @@ CREATE TABLE `workspace` (
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `workspace` (`id`, `name`, `tags`, `visibility`, `description`, `create_timestamp`, `update_timestamp`, `create_user_id`, `update_user_id`) VALUES ('1', 'default', '', 'public', '', 1722482392000, 1722482392000, 'admin', 'admin');
DROP TABLE IF EXISTS `workspace_member`;
CREATE TABLE `workspace_member` (
`workspace_id` varchar(64) NOT NULL,