作者 唐俊升

update:

1. 刷新用户redis缓存。
2. 修改菜单树,解决子节点未选择仍显示问题。
... ... @@ -100,6 +100,9 @@ eureka:
health-check-url-path: /ac/health
client:
#eureka注册中心服务器地址
# 关闭向eureka注册,用于测试
# register-with-eureka: false
# fetch-registry: false
service-url:
# defaultZone: http://127.0.0.1:12345/eureka/
defaultZone: http://192.168.1.53:12345/eureka/
... ...
... ... @@ -179,30 +179,42 @@ public class UserController {
* 更新目标用户的权限缓存
*/
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
final String authToken = authHeader.substring("Bearer ".length());
try {
String userJson = redisUtils.get(authToken);
if (userJson != null) {
KakoUser u = JSON.parseObject(userJson, KakoUser.class);
String username = u.getUsername();
// String username = JwtTokenUtil.parseToken(authToken);
if (username != null) {
UserDetails userDetails = userDetailService.loadUserByUsername(username);
if (userDetails != null) {
String json = JSON.toJSONString(userDetails);
redisUtils.set(authToken, json, 3600 * 24 * 7);
return new ResultJson("200", "缓存更新成功");
}
}
}
}catch (Exception e){
log.error(e.toString());
return new ResultJson("500","缓存更新失败");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
log.warn("刷新权限缓存失败:请求头缺少 Authorization 或不是 Bearer 格式");
return new ResultJson("500", "缓存更新失败");
}
final String authToken = authHeader.substring("Bearer ".length());
try {
//redis 中登录时写入的结构是 JSON(KakoUser),键为 token
String userJson = redisUtils.get(authToken);
if (userJson == null) {
log.warn("刷新权限缓存失败:token 对应的用户缓存不存在,token:{}", authToken);
return new ResultJson("500", "缓存更新失败");
}
KakoUser cachedUser = JSON.parseObject(userJson, KakoUser.class);
String username = cachedUser == null ? null : cachedUser.getUsername();
if (username == null) {
log.warn("刷新权限缓存失败:缓存内容无法解析出用户名,token:{}", authToken);
return new ResultJson("500", "缓存更新失败");
}
//重新加载最新的用户信息与权限(含 RBAC 过滤后的权限列表)
KakoUser kakoUser = userService.loadByUsername(username);
if (kakoUser == null) {
log.warn("刷新权限缓存失败:未查询到用户信息,username:{}", username);
return new ResultJson("500", "缓存更新失败");
}
/**
* 必须按登录时的格式写回:value = JSON(KakoUser),不能写成 JSON(UserDetails),
* 否则 KakoJwtAuthenticationTokenFilter 用 JSON.parseObject(userJson, KakoUser.class) 解析时会丢字段。
*/
redisUtils.set(authToken, JSON.toJSONString(kakoUser), 3600 * 24 * 7);
log.info("用户权限缓存刷新成功,username:{},token:{}", username, authToken);
return new ResultJson("200", "缓存更新成功");
} catch (Exception e) {
log.error("刷新用户权限缓存异常,token:" + authToken, e);
return new ResultJson("500", "缓存更新失败");
}
return new ResultJson("500","缓存更新失败");
}
}
... ...
... ... @@ -9,6 +9,7 @@ import com.tianbo.warehouse.annotation.cache.annotation.RedisCacheable;
import com.tianbo.warehouse.dao.PERMISSIONMapper;
import com.tianbo.warehouse.model.PERMISSION;
import com.tianbo.warehouse.service.PermissionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
... ... @@ -18,6 +19,7 @@ import java.util.List;
import java.util.Map;
@Service("PermissionService")
@Slf4j
public class PermissionServiceImp implements PermissionService {
@Resource
... ... @@ -83,32 +85,13 @@ public class PermissionServiceImp implements PermissionService {
public Map<String, Object> getUserMenus(Integer userId) {
Map<String, Object> data = new HashMap<String, Object>();
try {
//查询所有菜单
List<PERMISSION> allMenu = permissionMapper.findByUserId(userId);
// //根节点
// List<PERMISSION> rootMenu = new ArrayList<PERMISSION>();
// for (PERMISSION nav : allMenu) {
// if (nav.getParentId() == 0) {//父节点是0的,为根节点。
// rootMenu.add(nav);
// }
// }
/* 根据Menu类的order排序 */
// Collections.sort(rootMenu, order());
//为根菜单设置子菜单,getClild是递归调用的
// for (PERMISSION nav : rootMenu) {
// /* 获取根节点下的所有子节点 使用getChild方法*/
// List<PERMISSION> childList = getChild(nav.getPermissionId(), allMenu);
// nav.setChildren(childList);//给根节点设置子节点
// }
/**
* 输出构建好的菜单数据。
*
*/
//一次查出用户有权限的全部层级菜单(带 RBAC 权限过滤),再在 Java 层组树,避免递归查库
List<PERMISSION> allMenu = permissionMapper.findByUserIdWithLogin(userId);
data.put("success", "true");
data.put("list", allMenu);
data.put("list", getPermissionList(allMenu, 0));
return data;
} catch (Exception e) {
log.error("获取用户菜单树失败,userId:" + userId, e);
data.put("success", "false");
data.put("list", new ArrayList());
return data;
... ... @@ -119,32 +102,13 @@ public class PermissionServiceImp implements PermissionService {
public Map<String, Object> getUserMenusKako(String userId) {
Map<String, Object> data = new HashMap<String, Object>();
try {
//查询所有菜单
List<PERMISSION> allMenu = permissionMapper.findByUserIdKako(userId);
// //根节点
// List<PERMISSION> rootMenu = new ArrayList<PERMISSION>();
// for (PERMISSION nav : allMenu) {
// if (nav.getParentId() == 0) {//父节点是0的,为根节点。
// rootMenu.add(nav);
// }
// }
/* 根据Menu类的order排序 */
// Collections.sort(rootMenu, order());
//为根菜单设置子菜单,getClild是递归调用的
// for (PERMISSION nav : rootMenu) {
// /* 获取根节点下的所有子节点 使用getChild方法*/
// List<PERMISSION> childList = getChild(nav.getPermissionId(), allMenu);
// nav.setChildren(childList);//给根节点设置子节点
// }
/**
* 输出构建好的菜单数据。
*
*/
//一次查出用户有权限的全部层级菜单(带 RBAC 权限过滤),再在 Java 层组树,避免递归查库
List<PERMISSION> allMenu = permissionMapper.findByUserIdWithLoginKako(userId);
data.put("success", "true");
data.put("list", allMenu);
data.put("list", getPermissionList(allMenu, 0));
return data;
} catch (Exception e) {
log.error("获取卡口用户菜单树失败,userId:" + userId, e);
data.put("success", "false");
data.put("list", new ArrayList());
return data;
... ...