| | |
| | | private JwtUtil jwtUtil; |
| | | |
| | | /** |
| | | * 获取当前登录用户ID |
| | | * 从JWT token中解析用户ID |
| | | * 获取当前登录用户ID(包括匿名用户) |
| | | * 从JWT token中解析用户ID,包括负数的匿名用户ID |
| | | * |
| | | * @return 用户ID |
| | | * @throws SecurityException 当没有有效认证时抛出 |
| | | * @return 用户ID,包括匿名用户的负数ID |
| | | */ |
| | | public Long getCurrentUserId() { |
| | | public Long getCurrentUserIdIncludingAnonymous() { |
| | | try { |
| | | // 首先尝试从HTTP请求头中获取JWT token |
| | | String token = getTokenFromRequest(); |
| | | if (token != null && jwtUtil.validateToken(token)) { |
| | | Long userId = jwtUtil.getUserIdFromToken(token); |
| | | logger.debug("从JWT token中获取到用户ID: {}", userId); |
| | | logger.debug("从JWT token中获取到用户ID(包括匿名用户): {}", userId); |
| | | return userId; |
| | | } |
| | | |
| | |
| | | |
| | | // 如果没有有效的JWT token,尝试从Spring Security上下文获取 |
| | | Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
| | | if (authentication != null && authentication.isAuthenticated() && |
| | | !"anonymousUser".equals(authentication.getPrincipal())) { |
| | | logger.debug("获取到认证用户: {}", authentication.getName()); |
| | | if (authentication != null && authentication.isAuthenticated()) { |
| | | String principal = authentication.getName(); |
| | | logger.debug("获取到认证用户: {}", principal); |
| | | |
| | | // 检查是否为匿名用户 |
| | | if ("anonymousUser".equals(principal)) { |
| | | logger.debug("检测到Spring默认匿名用户,返回null"); |
| | | return null; |
| | | } else if (principal.startsWith("anonymous_")) { |
| | | // 从 "anonymous_-833488" 中提取用户ID |
| | | try { |
| | | String userIdStr = principal.substring("anonymous_".length()); |
| | | Long userId = Long.parseLong(userIdStr); |
| | | logger.debug("从匿名认证中解析到用户ID: {}", userId); |
| | | return userId; |
| | | } catch (NumberFormatException e) { |
| | | logger.warn("无法从匿名认证信息中解析用户ID: {}", principal); |
| | | } |
| | | } |
| | | |
| | | // 从Spring Security上下文中获取用户ID |
| | | try { |
| | | return Long.parseLong(authentication.getName()); |
| | | return Long.parseLong(principal); |
| | | } catch (NumberFormatException e) { |
| | | logger.warn("无法从认证信息中解析用户ID: {}", authentication.getName()); |
| | | logger.warn("无法从认证信息中解析用户ID: {}", principal); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | logger.warn("获取当前用户ID时发生异常: {}", e.getMessage()); |
| | | } |
| | | |
| | | // 如果没有有效的认证信息,抛出权限异常 |
| | | logger.warn("没有有效的认证信息,拒绝访问"); |
| | | throw new SecurityException("没有权限"); |
| | | // 如果没有有效的认证信息,返回null |
| | | logger.debug("没有有效的认证信息,返回null"); |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 获取当前登录用户ID |
| | | * 从JWT token中解析用户ID |
| | | * |
| | | * @return 用户ID,如果是匿名用户则返回null |
| | | */ |
| | | public Long getCurrentUserId() { |
| | | try { |
| | | // 首先尝试从HTTP请求头中获取JWT token |
| | | String token = getTokenFromRequest(); |
| | | if (token != null && jwtUtil.validateToken(token)) { |
| | | Long userId = jwtUtil.getUserIdFromToken(token); |
| | | logger.debug("从JWT token中获取到用户ID: {}", userId); |
| | | |
| | | // 检查是否为匿名用户(负数用户ID) |
| | | if (userId != null && userId < 0) { |
| | | logger.debug("检测到匿名用户,返回null"); |
| | | return null; |
| | | } |
| | | |
| | | return userId; |
| | | } |
| | | |
| | | if (token == null) { |
| | | logger.debug("未能从请求头获取到JWT token"); |
| | | } else { |
| | | logger.debug("从请求头获取到token但校验失败"); |
| | | } |
| | | |
| | | // 如果没有有效的JWT token,尝试从Spring Security上下文获取 |
| | | Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
| | | if (authentication != null && authentication.isAuthenticated()) { |
| | | String principal = authentication.getName(); |
| | | logger.debug("获取到认证用户: {}", principal); |
| | | |
| | | // 检查是否为匿名用户 |
| | | if ("anonymousUser".equals(principal) || principal.startsWith("anonymous_")) { |
| | | logger.debug("检测到匿名用户认证,返回null"); |
| | | return null; |
| | | } |
| | | |
| | | // 从Spring Security上下文中获取用户ID |
| | | try { |
| | | return Long.parseLong(principal); |
| | | } catch (NumberFormatException e) { |
| | | logger.warn("无法从认证信息中解析用户ID: {}", principal); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | logger.warn("获取当前用户ID时发生异常: {}", e.getMessage()); |
| | | } |
| | | |
| | | // 如果没有有效的认证信息,返回null(支持匿名访问) |
| | | logger.debug("没有有效的认证信息,返回null(匿名用户)"); |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 从HTTP请求中获取JWT token |
| | | */ |
| | | private String getTokenFromRequest() { |
| | | public String getTokenFromRequest() { |
| | | try { |
| | | ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
| | | if (attributes == null) { |