| | |
| | | package com.sandu.common.security; |
| | | |
| | | import com.sandu.common.redis.online.OnlineUser; |
| | | import com.sandu.common.redis.online.OnlineUserService; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.sandu.common.security.config.SecurityProperties; |
| | | import com.sandu.common.security.jwt.JwtTokenProvider; |
| | | import com.sandu.common.util.SpringContextHolder; |
| | | import com.sandu.common.security.token.TokenProvider; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
| | | 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 org.springframework.web.filter.OncePerRequestFilter; |
| | | |
| | | import javax.servlet.FilterChain; |
| | | import javax.servlet.ServletException; |
| | | import javax.servlet.ServletRequest; |
| | | import javax.servlet.ServletResponse; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | |
| | | /** |
| | |
| | | * @author chenjiantian |
| | | */ |
| | | @Slf4j |
| | | public class TokenFilter extends GenericFilterBean { |
| | | @AllArgsConstructor |
| | | public class TokenFilter extends OncePerRequestFilter { |
| | | |
| | | private final JwtTokenProvider tokenProvider; |
| | | |
| | | public TokenFilter(JwtTokenProvider tokenProvider) { |
| | | this.tokenProvider = tokenProvider; |
| | | } |
| | | private final TokenProvider tokenProvider; |
| | | private final SecurityProperties properties; |
| | | |
| | | @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); |
| | | protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { |
| | | String token = request.getHeader(properties.getHeader()); |
| | | |
| | | if (token != null && token.startsWith(properties.getTokenStartWith())) { |
| | | token = token.substring(properties.getTokenStartWith().length()); |
| | | } |
| | | |
| | | 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())) { |
| | | LoginUserInfo loginUserInfo = tokenProvider.validateToken(token); |
| | | if (loginUserInfo != null) { |
| | | if (StrUtil.equals(loginUserInfo.getToken(), token)) { |
| | | Authentication authentication = new UsernamePasswordAuthenticationToken( |
| | | loginUserInfo, null, |
| | | loginUserInfo.getAuthorities()); |
| | | SecurityContextHolder.getContext().setAuthentication(authentication); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | filterChain.doFilter(servletRequest, servletResponse); |
| | | |
| | | filterChain.doFilter(request, response); |
| | | } |
| | | |
| | | } |