package com.chuanghai.h3c_reporting.aop; import com.chuanghai.h3c_reporting.common.exception.BizCodeEnume; import com.chuanghai.h3c_reporting.common.exception.RRException; import com.chuanghai.h3c_reporting.dto.UserDTO; import com.chuanghai.h3c_reporting.util.JWTUtil; import io.jsonwebtoken.Claims; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * @Author: codingliang * @Description: 登录拦截 * @Date: 2021-04-29 15:57 * @Version: V1.0 **/ @Aspect @Component @Order(0) public class LoginCheckAspect { public static ThreadLocal threadLocal = new ThreadLocal<>(); /** * 管理员登录拦截 * @param point * @return * @throws Throwable */ @Around("@annotation(com.chuanghai.h3c_reporting.anno.AdminLoginCheck)") public Object adminLoginCheck(ProceedingJoinPoint point) throws Throwable { Claims claims = validateToken("admin_token"); Object adminIdStr = claims.get("id"); if (adminIdStr == null) { throw new RRException(BizCodeEnume.TOKEN_INVALID); } Long adminId = (Long) adminIdStr; UserDTO userVO = UserDTO.builder().id(adminId).build(); Object proceed; try { threadLocal.set(userVO); proceed = point.proceed(); } finally { threadLocal.remove(); } return proceed; } /** * 普通用户登录拦截 * @param point * @return * @throws Throwable */ @Around("@annotation(com.chuanghai.h3c_reporting.anno.UserLoginCheck)") public Object userLoginCheck(ProceedingJoinPoint point) throws Throwable { // 校验token Claims claims = validateToken("user_token"); Long id = (Long) claims.get("id"); String adminType = (String) claims.get("admin_type"); if (!StringUtils.hasText(String.valueOf(id))) { throw new RRException(BizCodeEnume.TOKEN_INVALID); } UserDTO userVO = UserDTO.builder().id(id).adminType(Integer.valueOf(adminType)).build(); Object proceed; try { threadLocal.set(userVO); proceed = point.proceed(); } finally { threadLocal.remove(); } return proceed; } // 检验token private Claims validateToken(String headName) { HttpServletRequest request = getHttpServletRequest(); String token = request.getHeader(headName); // 验证userToken if (!StringUtils.hasText(token)) { throw new RRException(BizCodeEnume.TOKEN_IS_EMPTY); } // 解析token Claims claims = JWTUtil.checkJWT(token); if (claims == null) { // 未登录 throw new RRException(BizCodeEnume.TOKEN_INVALID); } return claims; } // 获取request private HttpServletRequest getHttpServletRequest() { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes; return attributes.getRequest(); } }