package com.sandu.common.security; import com.sandu.common.redis.online.OnlineUser; import com.sandu.common.redis.online.OnlineUserService; import com.sandu.common.security.config.SecurityProperties; import com.sandu.common.security.jwt.JwtTokenProvider; import com.sandu.common.util.SpringContextHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; 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; /** * spring security过滤器 * 根据token拿到用户信息,放入spring security * * @author chenjiantian */ @Slf4j public class TokenFilter extends GenericFilterBean { private final JwtTokenProvider tokenProvider; public TokenFilter(JwtTokenProvider tokenProvider) { this.tokenProvider = tokenProvider; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String token = tokenProvider.getToken(httpServletRequest); SecurityProperties properties = SpringContextHolder.getBean(SecurityProperties.class); if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) { Authentication authentication = tokenProvider.getAuthentication(token); // 是否使用redis缓存用户功能 if (!properties.isCacheOnline()) { SecurityContextHolder.getContext().setAuthentication(authentication); } else { OnlineUserService onlineUserService = SpringContextHolder.getBean(OnlineUserService.class); OnlineUser onlineUser = onlineUserService.getOne(properties.getOnlineKey() + ((UserDetails) authentication.getPrincipal()).getUsername()); if (onlineUser != null) { // 匹配上当前用户的token才合法,防止jwt不受控制 if (token.equals(onlineUser.getToken())) { SecurityContextHolder.getContext().setAuthentication(authentication); } } } } filterChain.doFilter(servletRequest, servletResponse); } }