JwtTokenUserInterceptor.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package com.loan.system.interceptor;
  2. import com.loan.system.constant.JwtClaimsConstant;
  3. import com.loan.system.context.BaseContext;
  4. import com.loan.system.domain.entity.User;
  5. import com.loan.system.properties.JwtProperties;
  6. import com.loan.system.service.UserService;
  7. import com.loan.system.utils.JwtUtil;
  8. import io.jsonwebtoken.Claims;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  12. import org.springframework.security.core.GrantedAuthority;
  13. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  14. import org.springframework.security.core.context.SecurityContextHolder;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.web.method.HandlerMethod;
  17. import org.springframework.web.servlet.HandlerInterceptor;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. import java.util.stream.Collectors;
  23. /**
  24. * jwt令牌校验的拦截器
  25. */
  26. @Component
  27. @Slf4j
  28. public class JwtTokenUserInterceptor implements HandlerInterceptor {
  29. @Autowired
  30. private JwtProperties jwtProperties;
  31. @Autowired
  32. private UserService userService;
  33. /**
  34. * 在拦截的请求前校验jwt
  35. */
  36. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  37. //判断当前拦截到的是Controller的方法还是其他资源
  38. if (!(handler instanceof HandlerMethod)) {
  39. //当前拦截到的不是动态方法,直接放行
  40. return true;
  41. }
  42. //1、从请求头中获取令牌
  43. String token = request.getHeader(jwtProperties.getUserTokenName());
  44. //2、校验令牌
  45. try {
  46. log.info("jwt校验:{}", token);
  47. Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
  48. Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());
  49. BaseContext.setCurrentId(userId);
  50. //3、通过,放行
  51. return true;
  52. } catch (Exception ex) {
  53. //4、不通过,响应401状态码
  54. response.setStatus(401);
  55. return false;
  56. }
  57. }
  58. /**
  59. * 设置Spring Security认证信息
  60. */
  61. private void setSpringSecurityAuthentication(Long userId) {
  62. try {
  63. // 查询用户信息和权限
  64. User user = userService.findByIdAndIsDelete(userId);
  65. if (user == null) {
  66. log.info("用户不存在: {}", userId);
  67. return;
  68. }else{
  69. log.info("用户信息: {}", user.getId());
  70. }
  71. // 获取用户角色并转换为Spring Security权限
  72. List<GrantedAuthority> authorities = getUserAuthorities(user);
  73. // 创建认证信息
  74. UsernamePasswordAuthenticationToken authentication =
  75. new UsernamePasswordAuthenticationToken(user, null, authorities);
  76. SecurityContextHolder.getContext().setAuthentication(authentication);
  77. log.info("Spring Security认证设置完成 - 用户: {}, 角色: {}",
  78. user.getUsername(), authorities);
  79. } catch (Exception e) {
  80. log.info("设置Spring Security认证信息失败: {}", e.getMessage());
  81. }
  82. }
  83. /**
  84. * 根据用户信息获取权限列表
  85. * role字段是逗号分隔的字符串,如 "ADMIN,USER,MANAGER"
  86. */
  87. private List<GrantedAuthority> getUserAuthorities(User user) {
  88. List<GrantedAuthority> authorities = new ArrayList<>();
  89. log.info("用户角色字符串: {}", user.getRole());
  90. if (user.getRole() != null && !user.getRole().trim().isEmpty()) {
  91. // 分割逗号分隔的角色字符串
  92. String[] roleArray = user.getRole().split(",");
  93. // 为每个角色添加ROLE_前缀并创建权限对象
  94. for (String role : roleArray) {
  95. log.info("角色: {}", role);
  96. String trimmedRole = role.trim();
  97. if (!trimmedRole.isEmpty()) {
  98. authorities.add(new SimpleGrantedAuthority(trimmedRole));
  99. }
  100. }
  101. }
  102. log.info("用户角色解析: {} -> {}", user.getRole(),
  103. authorities.stream()
  104. .map(GrantedAuthority::getAuthority)
  105. .collect(Collectors.toList()));
  106. return authorities;
  107. }
  108. }