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")) { 
 | 
            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)) { 
 | 
                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.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); 
 | 
    } 
 | 
  
 | 
} 
 |