package com.genersoft.iot.vmp.conf.security; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.security.dto.JwtUser; import com.genersoft.iot.vmp.storager.dao.dto.Role; import com.genersoft.iot.vmp.storager.dao.dto.User; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; /** * jwt token 过滤器 */ @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { @Autowired private UserSetting userSetting; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { // 忽略登录请求的token验证 String requestURI = request.getRequestURI(); if (requestURI.equalsIgnoreCase("/api/user/login")) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(null, null, new ArrayList<>() ); SecurityContextHolder.getContext().setAuthentication(token); chain.doFilter(request, response); return; } if (!userSetting.isInterfaceAuthentication()) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(null, null, new ArrayList<>() ); SecurityContextHolder.getContext().setAuthentication(token); chain.doFilter(request, response); return; } String jwt = request.getHeader(JwtUtils.getHeader()); // 这里如果没有jwt,继续往后走,因为后面还有鉴权管理器等去判断是否拥有身份凭证,所以是可以放行的 // 没有jwt相当于匿名访问,若有一些接口是需要权限的,则不能访问这些接口 if (StringUtils.isBlank(jwt)) { jwt = request.getParameter(JwtUtils.getHeader()); if (StringUtils.isBlank(jwt)) { jwt = request.getHeader(JwtUtils.getApiKeyHeader()); if (StringUtils.isBlank(jwt)) { chain.doFilter(request, response); return; } } } JwtUser jwtUser = JwtUtils.verifyToken(jwt); String username = jwtUser.getUserName(); // TODO 处理各个状态 switch (jwtUser.getStatus()){ case EXPIRED: response.setStatus(400); chain.doFilter(request, response); // 异常 return; case EXCEPTION: // 过期 response.setStatus(400); chain.doFilter(request, response); return; case EXPIRING_SOON: // 即将过期 // return; default: } // 构建UsernamePasswordAuthenticationToken,这里密码为null,是因为提供了正确的JWT,实现自动登录 User user = new User(); user.setId(jwtUser.getUserId()); user.setUsername(jwtUser.getUserName()); user.setPassword(jwtUser.getPassword()); Role role = new Role(); role.setId(jwtUser.getRoleId()); user.setRole(role); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user, jwtUser.getPassword(), new ArrayList<>() ); SecurityContextHolder.getContext().setAuthentication(token); chain.doFilter(request, response); } }