Commit e6a3713d authored by 黎博's avatar 黎博

Merge branch 'master' into k8s

parents 4c9da3d6 58b65cb8
package cn.qg.holmes.aspect;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.exception.TokenInvalidException;
import cn.qg.holmes.exception.UnauthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
@ResponseBody
public class ExceptionHandlerAdvice {
@ExceptionHandler(UnauthorizedException.class)
public JsonResult handleException(UnauthorizedException e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("权限不足!", false);
}
@ExceptionHandler(TokenInvalidException.class)
public JsonResult handleException(TokenInvalidException e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("登录已失效,请重新登录!", false);
}
@ExceptionHandler(Exception.class)
public JsonResult handleException(Exception e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("系统异常!", false);
}
}
......@@ -10,6 +10,7 @@ import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
......@@ -24,6 +25,7 @@ import java.util.Map;
*/
@Aspect
@Component
@Order(1)
public class HttpLogAspect {
private static final Logger logger = LoggerFactory.getLogger(HttpLogAspect.class);
......
package cn.qg.holmes.aspect;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.Logical;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.exception.UnauthorizedException;
import cn.qg.holmes.service.auth.TokenService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Set;
@Aspect
@Slf4j
@Component
@Order(3)
public class PermissionAspect {
@Autowired
TokenService tokenService;
@Before("@annotation(cn.qg.holmes.config.annotation.RequiresPermissions)")
public void before(JoinPoint joinPoint) {
log.debug("开始执行权限检查");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String token = request.getHeader("token");
if (token == null) {
throw new UnauthorizedException();
}
UserInfoVo userInfoVo = tokenService.getUserInfoFromCache(token);
Set<String> myCodes = userInfoVo.getPermissionCodeList();
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
RequiresPermissions a = methodSignature.getMethod().getAnnotation(RequiresPermissions.class);
String[] perms = a.value();
log.debug("校验权限code: {}", Arrays.toString(perms));
log.debug("用户已有权限: {}", myCodes);
// 对比[要求]的code和[用户实际拥有]的code
if (a.logical() == Logical.AND) {
// 必须包含要求的每个权限
for (String perm: perms) {
if (!myCodes.contains(perm)) {
log.warn("用户缺少权限 code : {}", perm);
throw new UnauthorizedException(); //抛出[权限不足]的异常
}
}
} else {
// 多个权限只需包含其中一种即可
boolean flag = false;
for (String perm : perms) {
if (myCodes.contains(perm)) {
flag = true;
break;
}
}
if (!flag) {
log.warn("用户缺少权限 code= : {} (任意有一种即可)", Arrays.toString(perms));
throw new UnauthorizedException();//抛出[权限不足]的异常
}
}
}
}
package cn.qg.holmes.config.annotation;
public enum Logical {
AND, OR
}
package cn.qg.holmes.config.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
String[] value();
Logical logical() default Logical.AND;
}
package cn.qg.holmes.controller.auth;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.entity.auth.Permission;
import cn.qg.holmes.service.auth.PermissionService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@CrossOrigin
@RestController
@RequestMapping("/permission")
public class PermissionController {
@Autowired
PermissionService permissionService;
/**
* 新增权限
* @param permission 权限实体
* @return
*/
@PostMapping("/add")
public JsonResult addPermission(@RequestBody Permission permission) {
return JsonResult.buildSuccessResult(permissionService.save(permission));
}
/**
* 编辑权限
* @param permission 权限实体
* @return
*/
@PostMapping("/edit")
public JsonResult editPermission(@RequestBody Permission permission) {
return JsonResult.buildSuccessResult(permissionService.saveOrUpdate(permission));
}
/**
* 删除权限
* @param permissionId 权限id
* @return
*/
@GetMapping("/del")
public JsonResult delPermission(@RequestParam Integer permissionId) {
return JsonResult.buildSuccessResult(permissionService.removeById(permissionId));
}
/**
* 获取权限列表
* @return
*/
@GetMapping("/list")
public JsonResult getPermissionList() {
return JsonResult.buildSuccessResult(permissionService.getPermissionList());
}
@GetMapping("/list/paging")
public JsonResult getPermissionListByPage(@RequestParam Integer pageNum, @RequestParam Integer pageSize) {
IPage<Permission> iPage = new Page<>(pageNum, pageSize);
IPage page = permissionService.page(iPage);
Map<String, Object> map = new HashMap<>();
map.put("total", page.getTotal());
map.put("list", page.getRecords());
return JsonResult.buildSuccessResult(map);
}
}
package cn.qg.holmes.controller.auth;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.entity.auth.*;
import cn.qg.holmes.service.auth.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@CrossOrigin
@RestController
@RequestMapping("/role")
public class RoleController {
@Autowired
RoleService roleService;
@Autowired
UserRoleService userRoleService;
@Autowired
UserService userService;
@Autowired
RolePermissionService rolePermissionService;
@Autowired
PermissionService permissionService;
/**
* 获取角色列表
* @param pageNum 第几页
* @param pageSize 每页多少个
* @return
*/
@GetMapping("/list")
public JsonResult getRoleList(@RequestParam Integer pageNum, @RequestParam Integer pageSize) {
IPage<Role> roleIPage = new Page<>(pageNum, pageSize);
IPage page = roleService.page(roleIPage);
Map<String, Object> map = new HashMap<>();
List<Map<String, Object>> roleTotalInfoList = new ArrayList<>();
List<Role> roleList = page.getRecords();
for (Role role: roleList) {
Map<String, Object> roleInfoMap = new HashMap<>();
QueryWrapper<UserRole> userRoleQueryWrapper = new QueryWrapper<>();
QueryWrapper<RolePermission> rolePermissionQueryWrapper = new QueryWrapper<>();
Integer roleId = role.getId();
userRoleQueryWrapper.eq("role_id", roleId);
rolePermissionQueryWrapper.eq("role_id", roleId);
List<UserRole> userRoleList = userRoleService.list(userRoleQueryWrapper);
List<RolePermission> rolePermissionList = rolePermissionService.list(rolePermissionQueryWrapper);
List<String> usernameList = new ArrayList<>();
List<Integer> permissionIdList = new ArrayList<>();
for (UserRole userRole: userRoleList) {
User user = userService.getById(userRole.getUserId());
usernameList.add(user.getUsername());
}
for (RolePermission rolePermission: rolePermissionList) {
Permission permission = permissionService.getById(rolePermission.getPermissionId());
permissionIdList.add(permission.getId());
}
userRoleQueryWrapper.clear();
rolePermissionQueryWrapper.clear();
roleInfoMap.put("roleId", role.getId());
roleInfoMap.put("roleName", role.getRoleName());
roleInfoMap.put("usernameList", usernameList);
roleInfoMap.put("permissionIdList", permissionIdList);
roleInfoMap.put("createTime", role.getCreateTime());
roleInfoMap.put("updateTime", role.getUpdateTime());
roleTotalInfoList.add(roleInfoMap);
}
map.put("total", page.getTotal());
map.put("list", roleTotalInfoList);
return JsonResult.buildSuccessResult(map);
}
}
package cn.qg.holmes.controller.auth;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auth.Role;
import cn.qg.holmes.entity.auth.RolePermission;
import cn.qg.holmes.entity.auth.RolePermissionVo;
import cn.qg.holmes.service.auth.RolePermissionService;
import cn.qg.holmes.service.auth.RoleService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@CrossOrigin
@RestController
@RequestMapping("/role/permission")
public class RolePermissionController {
@Autowired
RolePermissionService rolePermissionService;
@Autowired
RoleService roleService;
/**
* 新增角色权限
* @return
*/
@RequiresPermissions("role:permission:add")
@PostMapping("/add")
public JsonResult addRolePermission(@RequestBody RolePermissionVo rolePermissionVo) {
String roleName = rolePermissionVo.getRoleName();
List<Integer> permissionIdList = rolePermissionVo.getPermissionIdList();
QueryWrapper<Role> roleQueryWrapper = new QueryWrapper<>();
roleQueryWrapper.eq("role_name", roleName);
if (roleService.getOne(roleQueryWrapper) != null) {
return JsonResult.buildErrorStateResult("角色名已存在!", false);
}
Role role = new Role();
role.setRoleName(rolePermissionVo.getRoleName());
boolean result = roleService.save(role);
if (!result) {
return JsonResult.buildErrorStateResult("新建角色失败!", false);
}
Role newRole = roleService.getOne(roleQueryWrapper);
Integer roleId = newRole.getId();
List<RolePermission> rolePermissionList = new ArrayList<>();
for (Integer permissionId: permissionIdList) {
RolePermission rolePermission = new RolePermission();
rolePermission.setRoleId(roleId);
rolePermission.setPermissionId(permissionId);
rolePermissionList.add(rolePermission);
}
return JsonResult.buildSuccessResult(rolePermissionService.saveBatch(rolePermissionList));
}
/**
* 编辑角色权限
* @return
*/
@RequiresPermissions("role:permission:edit")
@PostMapping("/edit")
public JsonResult editRolePermission(@RequestBody RolePermissionVo rolePermissionVo) {
Integer roleId = rolePermissionVo.getRoleId();
String roleName = rolePermissionVo.getRoleName();
Role role = new Role();
role.setId(roleId);
role.setRoleName(roleName);
boolean editRoleResult = roleService.saveOrUpdate(role);
if (!editRoleResult) {
return JsonResult.buildErrorStateResult("修改角色失败!", false);
}
try {
QueryWrapper<RolePermission> rolePermissionQueryWrapper = new QueryWrapper<>();
rolePermissionQueryWrapper.eq("role_id", roleId);
// 先查出数据库里有哪些
List<RolePermission> rolePermissionListInDB = rolePermissionService.list(rolePermissionQueryWrapper);
List<Integer> permissionIdList = rolePermissionVo.getPermissionIdList();
// 循环删除需要删除的
for (RolePermission rolePermission: rolePermissionListInDB) {
if (!permissionIdList.contains(rolePermission.getPermissionId())) {
rolePermissionService.removeById(rolePermission.getId());
}
}
rolePermissionQueryWrapper.clear();
// 然后处理需要新增或修改的
for (Integer permissionId: permissionIdList) {
rolePermissionQueryWrapper.eq("role_id", roleId);
rolePermissionQueryWrapper.eq("permission_id", permissionId);
RolePermission rolePermission = rolePermissionService.getOne(rolePermissionQueryWrapper);
if (rolePermission == null) {
rolePermission = new RolePermission();
rolePermission.setRoleId(roleId);
rolePermission.setPermissionId(permissionId);
rolePermissionService.saveOrUpdate(rolePermission);
} else {
rolePermission.setRoleId(roleId);
rolePermission.setPermissionId(permissionId);
rolePermissionService.saveOrUpdate(rolePermission);
}
rolePermissionQueryWrapper.clear();
}
return JsonResult.buildSuccessResult(true);
} catch (Exception e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("角色权限分配失败!", false);
}
}
/**
* 删除角色以及角色对应权限
* @param roleId 角色id
* @return
*/
@RequiresPermissions("role:permission:del")
@GetMapping("/del")
public JsonResult delRolePermission(Integer roleId) {
try {
roleService.removeById(roleId);
QueryWrapper<RolePermission> rolePermissionQueryWrapper = new QueryWrapper<>();
rolePermissionQueryWrapper.eq("role_id", roleId);
List<RolePermission> rolePermissionList = rolePermissionService.list(rolePermissionQueryWrapper);
for (RolePermission rolePermission: rolePermissionList) {
rolePermissionService.removeById(rolePermission.getId());
}
return JsonResult.buildSuccessResult(true);
} catch (Exception e) {
e.printStackTrace();
return JsonResult.buildErrorStateResult("角色删除失败!", false);
}
}
}
package cn.qg.holmes.controller.auth;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.entity.auth.LoginVo;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.entity.auth.UserRole;
import cn.qg.holmes.service.auth.LoginService;
import cn.qg.holmes.service.auth.TokenService;
import cn.qg.holmes.service.auth.UserRoleService;
import cn.qg.holmes.service.auth.UserService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
@CrossOrigin
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
UserService userService;
@Autowired
UserRoleService userRoleService;
@Autowired
LoginService loginService;
@Autowired
TokenService tokenService;
/**
* 登录,鉴权走ldap
* @return
*/
@PostMapping("/login")
public JsonResult login(@RequestBody LoginVo loginVo) {
String username = loginVo.getUsername();
String password = loginVo.getPassword();
boolean loginResult = loginService.login(username, password);
if (!loginResult) {
return JsonResult.buildErrorStateResult("用户名或密码错误", false);
}
User user = userService.getUserByUsername(username);
// 生成token,并将信息保存到redis
String token = tokenService.generateToken(user.getId());
Map<String, Object> map = new HashMap<>();
map.put("token", token);
// map.put("data", userService.getUserInfoByUsername(username));
return JsonResult.buildSuccessResult(map);
}
/**
* 登出
* @param token token
* @return
*/
@PostMapping("/logout")
public JsonResult logout(@RequestHeader String token) {
tokenService.invalidateToken(token);
return JsonResult.buildSuccessResult("登出成功!", true);
}
/**
* 获取用户信息
* @return
*/
@GetMapping("/info")
public JsonResult getInfo(@RequestHeader String token) {
UserInfoVo userInfoVo = tokenService.getUserInfoFromCache(token);
return JsonResult.buildSuccessResult(userInfoVo);
}
/**
* 获取用户信息列表
* @param pageNum 第几页
* @param pageSize 每页多少个
* @return
*/
@GetMapping("/list")
public JsonResult getUserList(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
IPage<UserRole> userIPage = userService.getUserInfoList(pageNum, pageSize);
Map<String, Object> map = new HashMap<>();
map.put("total", userIPage.getTotal());
map.put("list", userIPage.getRecords());
return JsonResult.buildSuccessResult(map);
}
}
package cn.qg.holmes.controller.auth;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auth.UserRole;
import cn.qg.holmes.service.auth.UserRoleService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@CrossOrigin
@RestController
@RequestMapping("/user/role")
public class UserRoleController {
@Autowired
UserRoleService userRoleService;
/**
* 用户新增角色
* @param userId 用户id
* @param roleId 角色id
* @return
*/
@RequiresPermissions("user:role:add")
@PostMapping("/add")
public JsonResult addUserRole(Integer userId, Integer roleId) {
QueryWrapper<UserRole> userRoleQueryWrapper = new QueryWrapper<>();
userRoleQueryWrapper.eq("user_id", userId);
userRoleQueryWrapper.eq("role_id", roleId);
if (userRoleService.getOne(userRoleQueryWrapper) != null) {
return JsonResult.buildErrorStateResult("用户角色已存在!", false);
}
userRoleQueryWrapper.clear();
userRoleQueryWrapper.eq("user_id", userId);
UserRole userRole = userRoleService.getOne(userRoleQueryWrapper);
if (userRole == null) {
UserRole newUserRole = new UserRole();
newUserRole.setUserId(userId);
newUserRole.setRoleId(roleId);
return JsonResult.buildSuccessResult(userRoleService.save(newUserRole));
} else {
userRole.setRoleId(roleId);
return JsonResult.buildSuccessResult(userRoleService.saveOrUpdate(userRole));
}
}
/**
* 编辑用户角色权限
* @param userRole 用户角色实体
* @return
*/
@RequiresPermissions("user:role:edit")
@PostMapping("/edit")
public JsonResult editUserRole(UserRole userRole) {
return JsonResult.buildSuccessResult(userRoleService.updateById(userRole));
}
}
package cn.qg.holmes.controller.auto;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auto.AutoModule;
import cn.qg.holmes.service.auto.AutoModuleService;
import cn.qg.holmes.service.auto.AutoProjectService;
......@@ -48,6 +49,7 @@ public class AutoModuleController {
* @param autoModule AutoModule实体类
* @return
*/
@RequiresPermissions("auto:module:add")
@PostMapping("/add")
public JsonResult addAutoModule(@RequestBody AutoModule autoModule) {
QueryWrapper<AutoModule> queryWrapper = new QueryWrapper<>();
......@@ -66,6 +68,7 @@ public class AutoModuleController {
* @param autoModule AutoModule实体类
* @return
*/
@RequiresPermissions("auto:module:edit")
@PostMapping("/modify")
public JsonResult editAutoModule(@RequestBody AutoModule autoModule) {
QueryWrapper<AutoModule> queryWrapper = new QueryWrapper<>();
......@@ -80,10 +83,11 @@ public class AutoModuleController {
}
}
/**
/**`
* 删除模块
* @param moduleId 模块id
*/
@RequiresPermissions("auto:module:del")
@GetMapping("/delete")
public JsonResult deleteAutoModule(@RequestParam Integer moduleId) {
if (autoModuleService.getById(moduleId) == null) {
......
package cn.qg.holmes.controller.auto;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auto.AutoProject;
import cn.qg.holmes.service.auto.AutoProjectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -45,6 +46,7 @@ public class AutoProjectController {
* @param autoProject 项目实体
* @return
*/
@RequiresPermissions("auto:project:add")
@PostMapping("/add")
public JsonResult autoProjectAdd(@RequestBody AutoProject autoProject) {
// 判断项目是否已存在
......@@ -62,6 +64,7 @@ public class AutoProjectController {
* @param autoProject 项目实体
* @return
*/
@RequiresPermissions("auto:project:edit")
@PostMapping("/modify")
public JsonResult autoProjectModify(@RequestBody AutoProject autoProject) {
if (autoProjectService.getById(autoProject.getId()) == null) {
......@@ -75,6 +78,7 @@ public class AutoProjectController {
* 删除项目
* @param projectId 项目id
*/
@RequiresPermissions("auto:project:del")
@GetMapping("/delete")
public JsonResult autoProjectDelete(@RequestParam Integer projectId) {
if (autoProjectService.getById(projectId) == null) {
......
package cn.qg.holmes.controller.auto;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auto.Interface;
import cn.qg.holmes.service.auto.AutoModuleService;
import cn.qg.holmes.service.auto.InterfaceService;
......@@ -70,6 +71,7 @@ public class InterfaceController {
* @param interfaceEntity 接口类实体
* @return
*/
@RequiresPermissions("auto:interface:add")
@PostMapping("/add")
public JsonResult addInterface(@RequestBody Interface interfaceEntity) {
QueryWrapper<Interface> queryWrapper = new QueryWrapper<>();
......@@ -90,6 +92,7 @@ public class InterfaceController {
* @param interfaceEntity 接口实体类
* @return
*/
@RequiresPermissions("auto:interface:edit")
@PostMapping("/modify")
public JsonResult modifyInterface(@RequestBody Interface interfaceEntity) {
if (interfaceService.getById(interfaceEntity.getId()) == null) {
......@@ -103,6 +106,7 @@ public class InterfaceController {
* @param interfaceId 接口id
* @return
*/
@RequiresPermissions("auto:interface:del")
@GetMapping("/delete")
public JsonResult deleteInterface(@RequestParam Integer interfaceId) {
if (interfaceService.getById(interfaceId) == null) {
......
package cn.qg.holmes.controller.auto;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auto.Scene;
import cn.qg.holmes.service.auto.AutoProjectService;
import cn.qg.holmes.service.auto.SceneService;
......@@ -52,6 +53,7 @@ public class SceneController {
* @param scene 场景实体
* @return
*/
@RequiresPermissions("auto:scene:add")
@PostMapping("/add")
public JsonResult addScene(@RequestBody Scene scene) {
if (scene.getProjectId() == null) {
......@@ -71,6 +73,7 @@ public class SceneController {
* @param scene 场景实体
* @return
*/
@RequiresPermissions("auto:scene:edit")
@PostMapping("/modify")
public JsonResult modifyScene(@RequestBody Scene scene) {
if (scene.getId() == null) {
......@@ -87,6 +90,7 @@ public class SceneController {
* @param sceneId 场景id
* @return
*/
@RequiresPermissions("auto:scene:del")
@GetMapping("/delete")
public JsonResult deleteScene(Integer sceneId) {
if (sceneService.getById(sceneId) == null) {
......
package cn.qg.holmes.controller.auto;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.auto.Interface;
import cn.qg.holmes.entity.auto.Testcase;
import cn.qg.holmes.service.auto.InterfaceService;
......@@ -71,6 +72,7 @@ public class TestcaseController {
* @param testcase
* @return
*/
@RequiresPermissions("auto:testcase:add")
@PostMapping("/add")
public JsonResult addTestcase(@RequestBody Testcase testcase) {
if (testcase.getName() == null || testcase.getInterfaceId() == null || testcase.getModuleId() == null) {
......@@ -85,6 +87,7 @@ public class TestcaseController {
* @param testcase 单接口用例实体
* @return
*/
@RequiresPermissions("auto:testcase:edit")
@PostMapping("/modify")
public JsonResult modifyTestcase(@RequestBody Testcase testcase) {
if (testcase.getId() == null) {
......@@ -99,6 +102,7 @@ public class TestcaseController {
* @param testcaseId 用例id
* @return
*/
@RequiresPermissions("auto:testcase:del")
@GetMapping("/delete")
public JsonResult deleteTestcase(@RequestParam Integer testcaseId) {
if (testcaseService.getById(testcaseId) == null) {
......
package cn.qg.holmes.controller.gitlab;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.gitlab.DingRobotPipelineVo;
import cn.qg.holmes.entity.gitlab.Pipeline;
import cn.qg.holmes.entity.jira.DingRobot;
......@@ -81,6 +82,7 @@ public class PipelineController {
* 新增ding robot 以及对应的pipeline
* @return
*/
@RequiresPermissions("qa:process:add")
@PostMapping("/add")
public JsonResult addRobotAndPipeline(@RequestBody DingRobotPipelineVo dingRobotPipelineVo) {
try {
......@@ -121,6 +123,7 @@ public class PipelineController {
* @param dingRobotPipelineVo
* @return
*/
@RequiresPermissions("qa:process:edit")
@PostMapping("/modify")
public JsonResult modifyPipeline(@RequestBody DingRobotPipelineVo dingRobotPipelineVo) {
try {
......@@ -172,6 +175,7 @@ public class PipelineController {
* @param dingRobotId
* @return
*/
@RequiresPermissions("qa:process:del")
@GetMapping("/delete")
public JsonResult deletePipeline(@RequestParam Integer dingRobotId) {
try {
......
package cn.qg.holmes.controller.jira;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.jira.DingRobot;
import cn.qg.holmes.entity.jira.SendScheduleVo;
import cn.qg.holmes.entity.jira.SendSmokingResultVo;
......@@ -154,6 +155,7 @@ public class JiraController {
* @return
* @throws Exception
*/
@RequiresPermissions("qa:process:schedule")
@PostMapping("/send/schedule")
public JsonResult sendTestReport(@RequestBody SendScheduleVo sendScheduleVo) throws Exception {
String JQL = "project = " + sendScheduleVo.getJiraProjectKey() + " AND resolution = Unresolved AND text ~ \"" + sendScheduleVo.getTestProjectName() + "\" ORDER BY priority DESC, updated DESC";
......@@ -167,6 +169,7 @@ public class JiraController {
* @param sendSmokingResultVo 发送冒烟进度实体
* @return
*/
@RequiresPermissions("qa:process:smoke")
@PostMapping("/send/smoking")
public JsonResult sendSmokingResult(@RequestBody SendSmokingResultVo sendSmokingResultVo) throws Exception {
String JQL = "project = " + sendSmokingResultVo.getJiraProjectKey() + " AND resolution = Unresolved AND text ~ \""
......
package cn.qg.holmes.controller.mock;
import cn.qg.holmes.common.JsonResult;
import cn.qg.holmes.config.annotation.RequiresPermissions;
import cn.qg.holmes.entity.mock.Mock;
import cn.qg.holmes.entity.mock.MockModule;
import cn.qg.holmes.service.mock.MockModuleService;
......@@ -33,6 +34,7 @@ public class MockController {
@RequestMapping(value = "/mock/**", method = { RequestMethod.GET, RequestMethod.POST})
public void mockMethod() {}
@RequiresPermissions("mock:add")
@PostMapping("/add/mock")
public JsonResult addMock(@RequestBody Mock mock) {
return JsonResult.buildSuccessResult(mockService.save(mock));
......@@ -55,6 +57,7 @@ public class MockController {
return JsonResult.buildSuccessResult(map);
}
@RequiresPermissions("mock:edit")
@PostMapping("/edit/mock")
public JsonResult modifyMock(@RequestBody Mock mock) {
return JsonResult.buildSuccessResult(mockService.saveOrUpdate(mock));
......
package cn.qg.holmes.entity.auth;
import lombok.Data;
/**
* 登录参数类
*/
@Data
public class LoginVo {
private String username;
private String password;
}
package cn.qg.holmes.entity.auth;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class Permission {
@TableId(type = IdType.AUTO)
private Integer id;
private String menuCode;
private String menuName;
private String permissionName;
private String permissionCode;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.holmes.entity.auth;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class Role {
@TableId(type = IdType.AUTO)
private Integer id;
private String roleName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.holmes.entity.auth;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class RolePermission {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer roleId;
private Integer permissionId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
package cn.qg.holmes.entity.auth;
import lombok.Data;
import java.util.List;
@Data
public class RolePermissionVo {
private Integer roleId;
private String roleName;
private List<Integer> permissionIdList;
}
package cn.qg.holmes.entity.auth;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
private String chineseName;
private String email;
private String title;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@TableField(exist = false)
private Integer roleId;
@TableField(exist = false)
private String roleName;
}
package cn.qg.holmes.entity.auth;
import lombok.Data;
import java.util.List;
import java.util.Set;
@Data
public class UserInfoVo {
private Integer userId;
private String username;
private String chineseName;
private String email;
private String title;
private List<Integer> roleIds;
private Set<String> menuList;
private Set<String> permissionCodeList;
}
package cn.qg.holmes.entity.auth;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class UserRole {
@TableId(type = IdType.AUTO)
private Integer id;
private Integer userId;
private Integer roleId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@TableField(exist = false)
private String userName;
@TableField(exist = false)
private String chineseName;
@TableField(exist = false)
private String email;
@TableField(exist = false)
private String title;
@TableField(exist = false)
private String roleName;
}
package cn.qg.holmes.exception;
public class TokenInvalidException extends RuntimeException{
public TokenInvalidException() {
super("Token已失效!");
}
}
package cn.qg.holmes.exception;
public class UnauthorizedException extends RuntimeException{
public UnauthorizedException() {
super("用户无此接口权限");
}
}
package cn.qg.holmes.mapper.auth;
import cn.qg.holmes.entity.auth.Permission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface PermissionMapper extends BaseMapper<Permission> {
}
package cn.qg.holmes.mapper.auth;
import cn.qg.holmes.entity.auth.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface RoleMapper extends BaseMapper<Role> {
}
package cn.qg.holmes.mapper.auth;
import cn.qg.holmes.entity.auth.RolePermission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface RolePermissionMapper extends BaseMapper<RolePermission> {
}
package cn.qg.holmes.mapper.auth;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.Map;
public interface UserMapper extends BaseMapper<User> {
IPage<UserRole> getUserInfoList(IPage<User> page);
}
package cn.qg.holmes.mapper.auth;
import cn.qg.holmes.entity.auth.UserRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserRoleMapper extends BaseMapper<UserRole> {
}
package cn.qg.holmes.service.auth;
import java.util.Map;
public interface LdapService {
boolean authenticate(String username, String password);
Map<String, String> getUserInfo();
}
package cn.qg.holmes.service.auth;
public interface LoginService {
boolean login(String username, String password);
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.Permission;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
public interface PermissionService extends IService<Permission>{
List<Map<String, Object>> getPermissionList();
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.RolePermission;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Set;
public interface RolePermissionService extends IService<RolePermission> {
Set<String> getPermissionSetForRoleIds(List<Integer> roleIds);
Set<String> getMenuSetForRoleIds(List<Integer> roleIds);
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.Role;
import com.baomidou.mybatisplus.extension.service.IService;
public interface RoleService extends IService<Role> {
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.UserInfoVo;
public interface TokenService {
String generateToken(Integer userId);
UserInfoVo getUserInfoFromCache(String token);
void invalidateToken(String token);
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.UserRole;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface UserRoleService extends IService<UserRole> {
List<Integer> getRoleIdsByUserId(Integer userId);
}
package cn.qg.holmes.service.auth;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.entity.auth.UserRole;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
User getUserByUsername(String username);
UserInfoVo getUserInfoByUsername(String username);
IPage<UserRole> getUserInfoList(Integer pageNum, Integer pageSize);
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.service.auth.LdapService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;
import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
@Slf4j
@Service
public class LdapServiceImpl implements LdapService, CommandLineRunner {
private LdapContext ctx = null;
private final Control[] connCtls = null;
private Map<String, String> userInfoMap = new HashMap<>();
private final String BASEDN = "ou=北京量科邦信息技术有限公司,dc=quantgroup,dc=cn";
private final String URL = "ldap://ldap.quantgroups.com:389/";
private final String password = "Quantgroup.com@2o17";
private final String username = "cn=common_auth_query,cn=users,DC=quantgroup,DC=cn";
private void ldapConnect() {
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, URL + BASEDN);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
// 此处若不指定用户名和密码,则自动转换为匿名登录
try {
ctx = new InitialLdapContext(env, connCtls);
} catch (Exception e) {
log.error("初始化失败:{}", ExceptionUtils.getStackTrace(e));
}
}
private String getUserDN(String username) {
String userDN = "";
ldapConnect();
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
String email = username.endsWith("@quantgroup.cn") ? username : username + "@quantgroup.cn";
NamingEnumeration<SearchResult> en = ctx.search("", "mail=" + email, constraints);
if (en == null || !en.hasMoreElements()) {
log.info("未找到该用户,uid={}", username);
}
// maybe more than one element
while (en != null && en.hasMoreElements()) {
Object obj = en.nextElement();
if (obj instanceof SearchResult) {
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + BASEDN;
userInfoMap.put("userDN", userDN);
userInfoMap.put("chineseName", si.getAttributes().get("name").get().toString());
userInfoMap.put("email", email);
userInfoMap.put("title", si.getAttributes().get("title").get().toString());
} else {
System.out.println(obj);
}
}
} catch (Exception e) {
log.error("异常:{}", ExceptionUtils.getStackTrace(e));
e.printStackTrace();
}
return userDN;
}
@Override
public boolean authenticate(String username, String password) {
boolean validate;
String userDN = getUserDN(username);
try {
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
ctx.reconnect(connCtls);
log.info("验证通过,uid={}", username);
validate = true;
} catch (AuthenticationException e) {
log.error("异常:{}", ExceptionUtils.getStackTrace(e));
System.out.println(e.toString());
validate = false;
} catch (NamingException e) {
log.error("异常:{}", ExceptionUtils.getStackTrace(e));
validate = false;
}
return validate;
}
@Override
public Map<String, String> getUserInfo() {
return userInfoMap;
}
@Override
public void run(String... args) throws Exception {
ldapConnect();
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserRole;
import cn.qg.holmes.service.auth.LdapService;
import cn.qg.holmes.service.auth.LoginService;
import cn.qg.holmes.service.auth.UserRoleService;
import cn.qg.holmes.service.auth.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import java.nio.charset.StandardCharsets;
import java.util.Map;
@Slf4j
@Service
public class LoginServiceImpl implements LoginService {
@Autowired
LdapService ldapService;
@Autowired
UserService userService;
@Autowired
UserRoleService userRoleService;
@Override
public boolean login(String username, String password) {
boolean result = ldapService.authenticate(username, password);
log.info("登录结果为:{}", result);
if (result) {
Map<String, String> userInfo = ldapService.getUserInfo();
User user = userService.getUserByUsername(username);
// 用户不存在,则创建新用户
if (user == null) {
User newUser = new User();
newUser.setUsername(username);
newUser.setChineseName(userInfo.get("chineseName"));
newUser.setEmail(userInfo.get("email"));
newUser.setTitle(userInfo.get("title"));
userService.save(newUser);
// 默认赋予一个权限,权限id在代码里写死
user = userService.getUserByUsername(username);
UserRole userRole = new UserRole();
userRole.setUserId(user.getId());
if (userInfo.get("title").startsWith("测试")) {
userRole.setRoleId(2);
} else {
userRole.setRoleId(3);
}
userRoleService.save(userRole);
}
}
return result;
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.Permission;
import cn.qg.holmes.mapper.auth.PermissionMapper;
import cn.qg.holmes.service.auth.PermissionService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {
@Autowired
PermissionMapper permissionMapper;
@Override
public List<Map<String, Object>> getPermissionList() {
List<Map<String, Object>> result = new ArrayList<>();
QueryWrapper<Permission> permissionQueryWrapper = new QueryWrapper<>();
permissionQueryWrapper.select("DISTINCT menu_name");
List<Permission> permissionList = permissionMapper.selectList(permissionQueryWrapper);
List<String> menuNameList = new ArrayList<>();
permissionList.forEach(permission -> {
menuNameList.add(permission.getMenuName());
});
permissionQueryWrapper.clear();
for (String menuName: menuNameList) {
permissionQueryWrapper.eq("menu_name", menuName);
List<Permission> permissions = permissionMapper.selectList(permissionQueryWrapper);
Map<String, Object> map = new HashMap<>();
List<Map<String, Object>> tempPermissionList = new ArrayList<>();
permissions.forEach(permission -> {
Map<String, Object> map2 = new HashMap<>();
map2.put("id", permission.getId());
map2.put("permissionName", permission.getPermissionName());
tempPermissionList.add(map2);
});
map.put("menuName", menuName);
map.put("permissionList", tempPermissionList);
result.add(map);
permissionQueryWrapper.clear();
}
return result;
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.RolePermission;
import cn.qg.holmes.mapper.auth.PermissionMapper;
import cn.qg.holmes.mapper.auth.RolePermissionMapper;
import cn.qg.holmes.service.auth.RolePermissionService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Service
public class RolePermissionServiceImpl extends ServiceImpl<RolePermissionMapper, RolePermission> implements RolePermissionService {
@Autowired
RolePermissionMapper rolePermissionMapper;
@Autowired
PermissionMapper permissionMapper;
@Override
public Set<String> getPermissionSetForRoleIds(List<Integer> roleIds) {
Set<String> permissionCodeSet = new HashSet<>();
for (Integer roleId: roleIds) {
QueryWrapper<RolePermission> rolePermissionQueryWrapper = new QueryWrapper<>();
rolePermissionQueryWrapper.eq("role_id", roleId);
List<RolePermission> rolePermissionList = rolePermissionMapper.selectList(rolePermissionQueryWrapper);
rolePermissionList.forEach(rolePermission -> {
permissionCodeSet.add(permissionMapper.selectById(rolePermission.getPermissionId()).getPermissionCode());
});
}
return permissionCodeSet;
}
@Override
public Set<String> getMenuSetForRoleIds(List<Integer> roleIds) {
Set<String> menuCodeSet = new HashSet<>();
for (Integer roleId: roleIds) {
QueryWrapper<RolePermission> rolePermissionQueryWrapper = new QueryWrapper<>();
rolePermissionQueryWrapper.eq("role_id", roleId);
List<RolePermission> rolePermissionList = rolePermissionMapper.selectList(rolePermissionQueryWrapper);
rolePermissionList.forEach(rolePermission -> {
menuCodeSet.add(permissionMapper.selectById(rolePermission.getPermissionId()).getMenuCode());
});
}
return menuCodeSet;
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.Role;
import cn.qg.holmes.mapper.auth.RoleMapper;
import cn.qg.holmes.service.auth.RoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.exception.TokenInvalidException;
import cn.qg.holmes.mapper.auth.UserMapper;
import cn.qg.holmes.service.auth.TokenService;
import cn.qg.holmes.service.auth.UserService;
import cn.qg.holmes.utils.RedisUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Slf4j
@Service
public class TokenServiceImpl implements TokenService {
private final String TOKEN_PREFIX = "user:token:";
@Autowired
RedisUtils redisUtils;
@Autowired
UserMapper userMapper;
@Autowired
UserService userService;
/**
* 生成token并存放到redis
* @param userId 用户id
* @return
*/
@Override
public String generateToken(Integer userId) {
String token = UUID.randomUUID().toString().replace("-", "").substring(0, 20);
User user = userMapper.selectById(userId);
UserInfoVo userInfoVo = userService.getUserInfoByUsername(user.getUsername());
//设置用户信息缓存
redisUtils.set(TOKEN_PREFIX + token, userInfoVo);
return token;
}
/**
* 根据token从redis获取用户信息
* @param token 用户token
* @return
*/
@Override
public UserInfoVo getUserInfoFromCache(String token) {
if (StringUtils.isEmpty(token)) {
throw new TokenInvalidException();
}
if (!redisUtils.hasKey(TOKEN_PREFIX + token)) {
throw new TokenInvalidException();
}
UserInfoVo userInfoVo = new UserInfoVo();
Map redisValue = (Map) redisUtils.get(TOKEN_PREFIX + token);
userInfoVo.setUserId((Integer) redisValue.get("userId"));
userInfoVo.setUsername(redisValue.get("username").toString());
userInfoVo.setChineseName(redisValue.get("chineseName").toString());
userInfoVo.setEmail(redisValue.get("email").toString());
userInfoVo.setTitle(redisValue.get("title").toString());
userInfoVo.setRoleIds((List<Integer>) redisValue.get("roleIds"));
Set<String> permissionCodeSet = new HashSet<>();
List<String> permissionCodeList = (List<String>) redisValue.get("permissionCodeList");
permissionCodeList.forEach(permissionCode -> {
permissionCodeSet.add(permissionCode);
});
Set<String> menuSet = new HashSet<>();
List<String> menuList = (List<String>) redisValue.get("menuList");
menuList.forEach(menu -> {
menuSet.add(menu);
});
userInfoVo.setPermissionCodeList(permissionCodeSet);
userInfoVo.setMenuList(menuSet);
return userInfoVo;
}
/**
* 删除redis里保存的token
* @param token
*/
@Override
public void invalidateToken(String token) {
if (!redisUtils.hasKey(TOKEN_PREFIX + token)) {
throw new TokenInvalidException();
}
redisUtils.del(TOKEN_PREFIX + token);
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.UserRole;
import cn.qg.holmes.mapper.auth.UserRoleMapper;
import cn.qg.holmes.service.auth.UserRoleService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole> implements UserRoleService {
@Autowired
UserRoleMapper userRoleMapper;
@Override
public List<Integer> getRoleIdsByUserId(Integer userId) {
QueryWrapper<UserRole> userRoleQueryWrapper = new QueryWrapper<>();
userRoleQueryWrapper.eq("user_id", userId);
List<UserRole> userRoleList = userRoleMapper.selectList(userRoleQueryWrapper);
List<Integer> roleIds = new ArrayList<>();
userRoleList.forEach(userRole -> {
roleIds.add(userRole.getRoleId());
});
return roleIds;
}
}
package cn.qg.holmes.service.auth.impl;
import cn.qg.holmes.entity.auth.User;
import cn.qg.holmes.entity.auth.UserInfoVo;
import cn.qg.holmes.entity.auth.UserRole;
import cn.qg.holmes.mapper.auth.UserMapper;
import cn.qg.holmes.service.auth.RolePermissionService;
import cn.qg.holmes.service.auth.UserRoleService;
import cn.qg.holmes.service.auth.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
UserMapper userMapper;
@Autowired
UserRoleService userRoleService;
@Autowired
RolePermissionService rolePermissionService;
@Override
public User getUserByUsername(String username) {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("username", username);
return userMapper.selectOne(userQueryWrapper);
}
/**
* 根据用户名获取用户信息
* @param username
* @return
*/
@Override
public UserInfoVo getUserInfoByUsername(String username) {
UserInfoVo userInfoVo = new UserInfoVo();
userInfoVo.setUsername(username);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("username", username);
User user = userMapper.selectOne(userQueryWrapper);
userInfoVo.setUserId(user.getId());
userInfoVo.setChineseName(user.getChineseName());
userInfoVo.setEmail(user.getEmail());
userInfoVo.setTitle(user.getTitle());
List<Integer> roleIds = userRoleService.getRoleIdsByUserId(user.getId());
userInfoVo.setRoleIds(roleIds);
Set<String> permissionCodeSet = rolePermissionService.getPermissionSetForRoleIds(roleIds);
userInfoVo.setPermissionCodeList(permissionCodeSet);
Set<String> menuCodeSet = rolePermissionService.getMenuSetForRoleIds(roleIds);
userInfoVo.setMenuList(menuCodeSet);
return userInfoVo;
}
/**
* 获取用户信息列表
* @param pageNum
* @param pageSize
* @return
*/
@Override
public IPage<UserRole> getUserInfoList(Integer pageNum, Integer pageSize) {
IPage<User> page = new Page<>(pageNum, pageSize);
return userMapper.getUserInfoList(page);
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.qg.holmes.mapper.auth.UserMapper">
<select id="getUserInfoList" resultType="cn.qg.holmes.entity.auth.UserRole">
SELECT ur.*,
u.`username` as userName,
u.`chinese_name` as chineseName,
u.`email` as `email`,
u.`title` as `title`,
r.`role_name` as roleName FROM `user` u
INNER JOIN `role` r
INNER JOIN `user_role` ur
ON u.`id` = ur.`user_id` AND r.`id` = ur.`role_id`
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment