Service
创建 IndexService
/**
* @author BNTang
* @version 1.0
* @project video_parent
* @description
* @since Created in 2021/5/2 002 21:03
**/
public interface IndexService {
/**
* 根据token获取用户信息
*
* @param name 用户名
* @return 用户信息
*/
Map<String, Object> getUserInfo(String name);
/**
* 获取当前登陆用户的菜单
* @param name 用户名
* @return 用户菜单信息
*/
List<JSONObject> getMenu(String name);
}
修改 MenuService
/**
* 根据用户ID查询用户权限
*
* @param id 用户ID
* @return 用户权限
*/
List<String> selectPermissionValueByUserId(String id);
/**
* 根据用户id返回前端的菜单
*
* @param id 用户id
* @return 前端的菜单
*/
List<JSONObject> selectPermissionByUserId(String id);
修改 RoleService
/**
* 根据用户id查询角色
*
* @param id 用户ID
* @return 用户对应的角色
*/
List<Role> selectRoleByUserId(String id);
修改 UserService
/**
* 根据用户名从数据库中取出用户信息
*
* @param username 用户名
* @return 用户信息
*/
User selectByUserName(String username);
Impl
创建 IndexServiceImpl
/**
* @author BNTang
* @version 1.0
* @project video_parent
* @description
* @since Created in 2021/5/2 002 21:09
**/
public class IndexServiceImpl implements IndexService {
private UserService userService;
private RoleService roleService;
private MenuService menuService;
private RedisTemplate<String, List<String>> redisTemplate;
/**
* 根据用户名获取用户登录信息
*/
public Map<String, Object> getUserInfo(String username) {
Map<String, Object> result = new HashMap<>(4);
User user = userService.selectByUserName(username);
if (ObjectUtils.isEmpty(user)) {
throw new BnTangException(200001, "没有该用户");
}
// 根据用户id获取角色
List<Role> roleList = roleService.selectRoleByUserId(user.getId());
List<String> roleNameList = roleList.stream().map(Role::getRoleName).collect(Collectors.toList());
if (roleNameList.size() == 0) {
// 前端框架必须返回一个角色,否则报错,如果没有角色,返回一个空角色
roleNameList.add("");
}
// 根据用户id获取操作权限值
List<String> permissionValueList = menuService.selectPermissionValueByUserId(user.getId());
// 把权限缓存到redis当中
redisTemplate.opsForValue().set(username, permissionValueList);
result.put("name", user.getUsername());
result.put("avatar", user.getSalt());
result.put("roles", roleNameList);
result.put("permissionValueList", permissionValueList);
return result;
}
/**
* 根据用户名获取动态菜单
*/
public List<JSONObject> getMenu(String username) {
// 根据用户id获取用户菜单权限
return menuService.selectPermissionByUserId(userService.selectByUserName(username).getId());
}
}
修改 MenuServiceImpl
private UserService userService;
public List<String> selectPermissionValueByUserId(String id) {
List<String> selectPermissionValueList;
if (this.isSysAdmin(id)) {
// 如果是系统管理员,获取所有权限
selectPermissionValueList = baseMapper.selectAllMenuValue();
} else {
// 否则就不是系统管理员,根据用户查询菜单权限
selectPermissionValueList = baseMapper.selectMenuValueByUserId(id);
}
return selectPermissionValueList;
}
public List<JSONObject> selectPermissionByUserId(String id) {
List<Menu> selectMenuList;
if (this.isSysAdmin(id)) {
// 如果是超级管理员,获取所有菜单
selectMenuList = baseMapper.selectList(null);
} else {
selectMenuList = baseMapper.selectMenuByUserId(id);
}
// 1.构建树形菜单
List<Menu> menuList = buildTreeMenu(selectMenuList);
// 2.返回给前端json数据
return buildMenuWebList(menuList);
}
private List<JSONObject> buildMenuWebList(List<Menu> menuList) {
List<JSONObject> menus = new ArrayList<>();
if (menuList.size() == 1) {
// 左侧一级菜单
menuList.get(0).getChildren().forEach(oneMenu -> {
JSONObject oneMenuObj = this.generateJsonObj(oneMenu, false);
List<JSONObject> children = new ArrayList<>();
oneMenu.getChildren().forEach(twoMenu -> {
JSONObject twoMenuObj = this.generateJsonObj(twoMenu, false);
children.add(twoMenuObj);
twoMenu.getChildren().forEach(three -> {
if (StringUtils.isEmpty(three.getPath())) {
return;
}
JSONObject threeMenu = this.generateJsonObj(three, true);
children.add(threeMenu);
});
});
oneMenuObj.put("children", children);
menus.add(oneMenuObj);
});
}
return menus;
}
/**
* 生成菜单信息JSON对象
*/
private JSONObject generateJsonObj(Menu menu, Boolean whetherDisplay) {
JSONObject jsonObj = new JSONObject();
jsonObj.put("path", menu.getPath());
jsonObj.put("component", menu.getComponent());
jsonObj.put("hidden", whetherDisplay);
JSONObject oneMeta = new JSONObject();
oneMeta.put("title", menu.getName());
if (!StringUtils.isEmpty(menu.getIcon())) {
oneMeta.put("icon", menu.getIcon());
}
jsonObj.put("meta", oneMeta);
return jsonObj;
}
/**
* 判断用户是否是系统管理员
*/
private boolean isSysAdmin(String userId) {
User user = userService.getById(userId);
return !ObjectUtils.isEmpty(user) && "admin".equals(user.getUsername());
}
修改 RoleServiceImpl
public List<Role> selectRoleByUserId(String id) {
// 根据用户id查询拥有的角色id
List<UserRole> userRoleList = userRoleService.list(new QueryWrapper<UserRole>()
.eq("user_id", id)
.select("role_id"));
//获取所有角色id
List<String> roleIdList = userRoleList.stream().map(UserRole::getRoleId).collect(Collectors.toList());
// 根据角色id查询所有的角色信息
List<Role> roleList = new ArrayList<>();
if (roleIdList.size() > 0) {
roleList = baseMapper.selectBatchIds(roleIdList);
}
return roleList;
}
创建 UserDetailsServiceImpl
/**
* @author BNTang
* @version 1.0
* @project video_parent
* @description 用户验证业务
* @since Created in 2021/5/2 002 16:42
**/
public class UserDetailsServiceImpl implements UserDetailsService {
private UserService userService;
private MenuService menuService;
/***
* 根据账号获取用户信息
*/
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 从数据库中取出用户信息
User user = userService.selectByUserName(username);
// 判断用户是否存在
if (ObjectUtils.isEmpty(user)) {
throw new UsernameNotFoundException("用户不存在!");
}
// 返回UserDetails实现类
top.it6666.common_security.entity.User curUser = new top.it6666.common_security.entity.User();
BeanUtils.copyProperties(user, curUser);
// 查询用户权限
List<String> authorities = menuService.selectPermissionValueByUserId(user.getId());
SecurityUser securityUser = new SecurityUser(curUser);
securityUser.setPermissionValueList(authorities);
return securityUser;
}
}
修改 UserServiceImpl
public User selectByUserName(String username) {
return baseMapper.selectOne(new QueryWrapper<User>().eq("username", username));
}
Controller
创建 IndexController
/**
* @author BNTang
* @version 1.0
* @project video_parent
* @description
* @since Created in 2021/5/2 002 21:02
**/
(tags = "工作人员-用户组")
("/service_auth/admin/index")
public class IndexController {
private IndexService indexService;
/**
* 根据token获取用户信息
*/
(value = "根据token获取用户信息")
("info")
public ResponseResult info() {
// 获取当前登录用户用户名
return ResponseResult.ok().data(indexService.getUserInfo(SecurityContextHolder.getContext().getAuthentication().getName()));
}
/**
* 获取当前登陆用户的菜单
*/
(value = "获取当前登陆用户的菜单")
("menu")
public ResponseResult getMenu() {
// 获取当前登录用户用户名
List<JSONObject> menuList = indexService.getMenu(SecurityContextHolder.getContext().getAuthentication().getName());
return ResponseResult.ok().data("menuList", menuList);
}
}
修改 application.yml 加入 Redis 的相关配置
redis
host127.0.0.1
port6379
database0
timeout1800000
lettuce
pool
max-active20
max-wait1
# 最大阻塞等待时间
max-idle5
min-idle0
修改 service_auth 的 pom.xml 加入 security 安全认证
<dependencies>
<dependency>
<groupId>top.it6666</groupId>
<artifactId>common_security</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
Mapper
修改 MenuMapper
/**
* <p>
* 菜单权限 Mapper 接口
* </p>
*
* @author BNTang
* @since 2021-04-21
*/
public interface MenuMapper extends BaseMapper<Menu> {
/**
* 查询所有的菜单
*
* @return 菜单信息
*/
List<String> selectAllMenuValue();
/**
* 根据用户ID查询用户菜单权限
*
* @param id 用户ID
* @return 菜单权限
*/
List<String> selectMenuValueByUserId(String id);
/**
* 根据用户id获取菜单权限
*
* @param id 用户id
* @return 菜单权限信息数据
*/
List<Menu> selectMenuByUserId(String id);
}
修改 MenuMapper.xml
<mapper namespace="top.it6666.service_auth.mapper.MenuMapper">
<select id="selectAllMenuValue" resultType="java.lang.String">
SELECT permission_value
FROM auth_menu
WHERE type = 2
AND is_deleted = 0
</select>
<select id="selectMenuValueByUserId" resultType="java.lang.String">
SELECT p.permission_value
FROM auth_user_role ur
INNER JOIN auth_role_menu rp ON rp.role_id = ur.role_id
INNER JOIN auth_menu p ON p.id = rp.permission_id
WHERE ur.user_id = #{userId}
AND p.type = 2
AND ur.is_deleted = 0
AND rp.is_deleted = 0
AND p.is_deleted = 0
</select>
<select id="selectMenuByUserId" resultType="top.it6666.service_auth.entity.Menu">
SELECT p.id,
p.pid,
p.name,
p.type,
p.permission_value,
path,
p.component,
p.icon,
p.status,
p.is_deleted
FROM auth_user_role ur
INNER JOIN auth_role_menu rp ON rp.role_id = ur.role_id
INNER JOIN auth_menu p ON p.id = rp.permission_id
WHERE ur.user_id = #{userId}
AND ur.is_deleted = 0
AND rp.is_deleted = 0
AND p.is_deleted = 0
</select>
</mapper>
修改 Menu 实体类去除逻辑删除