package com.oying.modules.security.security; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import com.oying.modules.security.config.SecurityProperties; import com.oying.modules.security.service.dto.OnlineUserDto; import com.oying.modules.security.service.OnlineUserService; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.util.StringUtils; import org.springframework.web.filter.GenericFilterBean; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.io.IOException; /** * @author Z */ @Slf4j public class TokenFilter extends GenericFilterBean { private final TokenProvider tokenProvider; private final SecurityProperties properties; private final OnlineUserService onlineUserService; /** * @param tokenProvider Token * @param properties JWT * @param onlineUserService 用户在线 */ public TokenFilter(TokenProvider tokenProvider, SecurityProperties properties, OnlineUserService onlineUserService) { this.properties = properties; this.onlineUserService = onlineUserService; this.tokenProvider = tokenProvider; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String token = resolveToken(httpServletRequest); // 对于 Token 为空的不需要去查 Redis if(StrUtil.isNotBlank(token)){ // 获取用户Token的Key String loginKey = tokenProvider.loginKey(token); OnlineUserDto onlineUserDto = onlineUserService.getOne(loginKey); // 判断用户在线信息是否为空 if (onlineUserDto != null) { // Token 续期判断 tokenProvider.checkRenewal(token); // 获取认证信息,设置上下文 Authentication authentication = tokenProvider.getAuthentication(token); SecurityContextHolder.getContext().setAuthentication(authentication); } } filterChain.doFilter(servletRequest, servletResponse); } /** * 初步检测Token * * @param request / * @return / */ private String resolveToken(HttpServletRequest request) { String bearerToken = request.getHeader(properties.getHeader()); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(properties.getTokenStartWith())) { // 去掉令牌前缀 return bearerToken.replace(properties.getTokenStartWith(), ""); } else { log.debug("非法Token:{}", bearerToken); } return null; } }