UserAuthService.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package com.simuwang.base.components;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.simuwang.base.common.support.dos.OnlyIdNameDO;
  5. import com.simuwang.base.mapper.system.SysMenuMapper;
  6. import com.simuwang.base.mapper.system.SysRoleMapper;
  7. import com.simuwang.base.mapper.system.SysUserMapper;
  8. import com.simuwang.base.pojo.dos.sys.SysMenuDO;
  9. import com.simuwang.base.pojo.dos.sys.SysRoleDO;
  10. import com.simuwang.base.pojo.dos.sys.SysUserDO;
  11. import org.springframework.stereotype.Service;
  12. import java.util.List;
  13. import java.util.Objects;
  14. import java.util.stream.Collectors;
  15. /**
  16. * @author wangzaijun
  17. * @date 2024/9/13 17:08
  18. * @description 用户权限服务
  19. */
  20. @Service
  21. public class UserAuthService {
  22. private final SysUserMapper userMapper;
  23. private final SysRoleMapper roleMapper;
  24. private final SysMenuMapper menuMapper;
  25. public UserAuthService(SysUserMapper userMapper, SysRoleMapper roleMapper, SysMenuMapper menuMapper) {
  26. this.userMapper = userMapper;
  27. this.roleMapper = roleMapper;
  28. this.menuMapper = menuMapper;
  29. }
  30. /**
  31. * 更新用户密码
  32. *
  33. * @param entity /
  34. */
  35. public void updatePwd(SysUserDO entity) {
  36. this.userMapper.updateById(entity);
  37. }
  38. /**
  39. * 根据用户账号获取用户信息
  40. *
  41. * @param username 用户账号
  42. * @return /
  43. */
  44. public SysUserDO getUserInfoByUsername(String username) {
  45. LambdaQueryWrapper<SysUserDO> wrapper = Wrappers.lambdaQuery(SysUserDO.class)
  46. .eq(SysUserDO::getUserName, username);
  47. return this.userMapper.selectOne(wrapper);
  48. }
  49. /**
  50. * 根据用户id获取角色权限列表
  51. *
  52. * @param userId 用户id
  53. * @return /
  54. */
  55. public List<SysRoleDO> listUserRoleByUserId(Integer userId) {
  56. boolean admin = this.isAdmin(userId);
  57. if (admin) {
  58. return this.userMapper.selectAllRole();
  59. }
  60. return this.userMapper.selectRoleByUserId(userId);
  61. }
  62. /**
  63. * 根据用户id获取菜单列表
  64. *
  65. * @param userId 用户id
  66. * @return /
  67. */
  68. public List<SysMenuDO> listUserMenuByUserId(Integer userId) {
  69. boolean admin = this.isAdmin(userId);
  70. if (admin) {
  71. return this.userMapper.selectAllMenu();
  72. }
  73. return this.userMapper.selectMenuByUserId(userId);
  74. }
  75. /**
  76. * 获取用户绑定的角色
  77. *
  78. * @param userId 用户id
  79. * @return /
  80. */
  81. public List<OnlyIdNameDO> userBindRoles(Integer userId) {
  82. boolean admin = this.isAdmin(userId);
  83. if (admin) {
  84. return this.userMapper.allRoles();
  85. }
  86. return this.userMapper.listBindRoles(userId);
  87. }
  88. /**
  89. * 角色分配的权限
  90. *
  91. * @param roleId 角色id
  92. * @return /
  93. */
  94. public List<OnlyIdNameDO> roleAssignPerms(Integer roleId) {
  95. boolean adminByRole = this.isAdminByRole(roleId);
  96. if (adminByRole) {
  97. return this.roleMapper.allPerms();
  98. }
  99. List<OnlyIdNameDO> dataList = this.roleMapper.listAssignPerms(roleId);
  100. // 找到所有父id是上述数据的
  101. List<Integer> menuIds = dataList.stream().map(OnlyIdNameDO::getId).distinct().collect(Collectors.toList());
  102. LambdaQueryWrapper<SysMenuDO> wrapper = Wrappers.lambdaQuery(SysMenuDO.class)
  103. .select(SysMenuDO::getMenuId, SysMenuDO::getParentId)
  104. .in(SysMenuDO::getParentId, menuIds)
  105. .eq(SysMenuDO::getStatus, 1);
  106. List<SysMenuDO> tempList = this.menuMapper.selectList(wrapper);
  107. // 过滤存在父节点引用的菜单id
  108. List<Integer> pids = tempList.stream().map(SysMenuDO::getParentId).distinct().collect(Collectors.toList());
  109. dataList.removeIf(e -> pids.contains(e.getId()));
  110. return dataList;
  111. }
  112. /**
  113. * 判断用户是否超级管理员
  114. * 1、如果用户id为0或者1则为超级管理员
  115. * 2、或者用户有system和admin角色
  116. *
  117. * @param userId 用户id
  118. * @return /
  119. */
  120. private boolean isAdmin(Integer userId) {
  121. if (Objects.equals(0, userId) || Objects.equals(1, userId)) {
  122. return true;
  123. }
  124. List<SysRoleDO> roles = this.userMapper.selectRoleByUserId(userId);
  125. SysRoleDO adminRole = roles.stream()
  126. .filter(e -> Objects.equals(1, e.getRoleId())
  127. || "system".equalsIgnoreCase(e.getRoleKey())
  128. || "admin".equalsIgnoreCase(e.getRoleKey()))
  129. .findFirst().orElse(null);
  130. return adminRole != null;
  131. }
  132. /**
  133. * 根据角色id判断角色是否管理员
  134. *
  135. * @param roleId 角色id
  136. * @return /
  137. */
  138. private boolean isAdminByRole(Integer roleId) {
  139. if (Objects.equals(1, roleId)) {
  140. return true;
  141. }
  142. SysRoleDO role = this.roleMapper.selectById(roleId);
  143. return role != null
  144. && ("system".equalsIgnoreCase(role.getRoleKey()) || "admin".equalsIgnoreCase(role.getRoleKey()));
  145. }
  146. }