package com.rongyichuang.auth.filter; import com.rongyichuang.auth.util.JwtUtil; import com.rongyichuang.user.entity.User; import com.rongyichuang.user.repository.UserRepository; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Optional; /** * JWT认证过滤器 */ @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class); @Autowired private JwtUtil jwtUtil; @Autowired private UserRepository userRepository; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String authHeader = request.getHeader("Authorization"); String token = null; Long userId = null; // 从请求头中提取JWT token if (authHeader != null && authHeader.startsWith("Bearer ")) { token = authHeader.substring(7); try { userId = jwtUtil.getUserIdFromToken(token); } catch (Exception e) { logger.debug("JWT token解析失败: {}", e.getMessage()); } } // 如果token有效且当前没有认证信息 if (userId != null && SecurityContextHolder.getContext().getAuthentication() == null) { // 验证token是否有效 if (jwtUtil.validateToken(token)) { // 查找用户信息 Optional userOpt = userRepository.findById(userId); if (userOpt.isPresent()) { User user = userOpt.get(); // 创建认证对象 UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken( user.getId().toString(), null, new ArrayList<>() // 暂时不设置权限,后续可以根据角色设置 ); authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authToken); logger.debug("用户认证成功: userId={}, phone={}", user.getId(), user.getPhone()); } } } filterChain.doFilter(request, response); } }