package cn.lili.common.security.context; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.enums.SecurityEnum; import cn.lili.common.security.token.SecretKeyUtil; import cn.lili.common.utils.StringUtils; import com.google.gson.Gson; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * 用户上下文 * * @author Chopper * @version v4.0 * @since 2020/11/14 20:27 */ public class UserContext { /** * 根据request获取用户id * * @return 授权用户 */ public static String getCurrentUserId() { if (RequestContextHolder.getRequestAttributes() != null) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String accessToken = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); return getAuthUser(accessToken).getId(); } return null; } /** * 根据request获取用户信息 * * @return 授权用户 */ public static AuthUser getCurrentUser() { if (RequestContextHolder.getRequestAttributes() != null) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String accessToken = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); return getAuthUser(accessToken); } return null; } /** * 根据request获取用户信息 * * @return 授权用户 */ public static String getUuid() { if (RequestContextHolder.getRequestAttributes() != null) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); return request.getHeader(SecurityEnum.UUID.getValue()); } return null; } /** * 根据jwt获取token重的用户信息 * * @param cache 缓存 * @param accessToken token * @return 授权用户 */ public static AuthUser getAuthUser(Cache cache, String accessToken) { try { AuthUser authUser = getAuthUser(accessToken); assert authUser != null; if (!cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole(), authUser.getId()) + accessToken)) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } return authUser; } catch (Exception e) { return null; } } public static String getCurrentUserToken() { if (RequestContextHolder.getRequestAttributes() != null) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); return request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); } return null; } /** * 根据jwt获取token重的用户信息 * * @param accessToken token * @return 授权用户 */ public static AuthUser getAuthUser(String accessToken) { try { //获取token的信息 Claims claims = Jwts.parser() .setSigningKey(SecretKeyUtil.generalKeyByDecoders()) .parseClaimsJws(accessToken).getBody(); //获取存储在claims中的用户信息 String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString(); return new Gson().fromJson(json, AuthUser.class); } catch (Exception e) { return null; } } /** * 写入邀请人信息 */ public static void settingInviter(String memberId, Cache cache) { if (RequestContextHolder.getRequestAttributes() != null) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); //邀请人id String inviterId = request.getHeader(SecurityEnum.INVITER.getValue()); if (StringUtils.isNotEmpty(inviterId)) { cache.put(CachePrefix.INVITER.getPrefix() + memberId, inviterId); } } } }