xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-starter-auth/src/main/java/org/springblade/core/secure/utils/AuthUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,449 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package org.springblade.core.secure.utils;
import io.jsonwebtoken.Claims;
import org.springblade.core.jwt.JwtUtil;
import org.springblade.core.jwt.props.JwtProperties;
import org.springblade.core.launch.constant.TokenConstant;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.tool.constant.RoleConstant;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.Objects;
/**
 * Auth工具类
 *
 * @author Chill
 */
public class AuthUtil {
   private static final String BLADE_USER_REQUEST_ATTR = "_BLADE_USER_REQUEST_ATTR_";
   private final static String HEADER = TokenConstant.HEADER;
   private final static String ACCOUNT = TokenConstant.ACCOUNT;
   private final static String USER_NAME = TokenConstant.USER_NAME;
   private final static String NICK_NAME = TokenConstant.NICK_NAME;
   private final static String USER_ID = TokenConstant.USER_ID;
   private final static String DEPT_ID = TokenConstant.DEPT_ID;
   private final static String POST_ID = TokenConstant.POST_ID;
   private final static String ROLE_ID = TokenConstant.ROLE_ID;
   private final static String ROLE_NAME = TokenConstant.ROLE_NAME;
   private final static String TENANT_ID = TokenConstant.TENANT_ID;
   private final static String OAUTH_ID = TokenConstant.OAUTH_ID;
   private final static String CLIENT_ID = TokenConstant.CLIENT_ID;
   private final static String DETAIL = TokenConstant.DETAIL;
   private static JwtProperties jwtProperties;
   /**
    * èŽ·å–é…ç½®ç±»
    *
    * @return jwtProperties
    */
   private static JwtProperties getJwtProperties() {
      if (jwtProperties == null) {
         jwtProperties = SpringUtil.getBean(JwtProperties.class);
      }
      return jwtProperties;
   }
   /**
    * èŽ·å–ç”¨æˆ·ä¿¡æ¯
    *
    * @return BladeUser
    */
   public static BladeUser getUser() {
      HttpServletRequest request = WebUtil.getRequest();
      if (request == null) {
         return null;
      }
      // ä¼˜å…ˆä»Ž request ä¸­èŽ·å–
      Object bladeUser = request.getAttribute(BLADE_USER_REQUEST_ATTR);
      if (bladeUser == null) {
         bladeUser = getUser(request);
         if (bladeUser != null) {
            // è®¾ç½®åˆ° request ä¸­
            request.setAttribute(BLADE_USER_REQUEST_ATTR, bladeUser);
         }
      }
      return (BladeUser) bladeUser;
   }
   /**
    * èŽ·å–ç”¨æˆ·ä¿¡æ¯
    *
    * @param request request
    * @return BladeUser
    */
   @SuppressWarnings("unchecked")
   public static BladeUser getUser(HttpServletRequest request) {
      Claims claims = getClaims(request);
      if (claims == null) {
         return null;
      }
      String clientId = Func.toStr(claims.get(AuthUtil.CLIENT_ID));
      Long userId = Func.toLong(claims.get(AuthUtil.USER_ID));
      String tenantId = Func.toStr(claims.get(AuthUtil.TENANT_ID));
      String oauthId = Func.toStr(claims.get(AuthUtil.OAUTH_ID));
      String deptId = Func.toStrWithEmpty(claims.get(AuthUtil.DEPT_ID), StringPool.MINUS_ONE);
      String postId = Func.toStrWithEmpty(claims.get(AuthUtil.POST_ID), StringPool.MINUS_ONE);
      String roleId = Func.toStrWithEmpty(claims.get(AuthUtil.ROLE_ID), StringPool.MINUS_ONE);
      String account = Func.toStr(claims.get(AuthUtil.ACCOUNT));
      String roleName = Func.toStr(claims.get(AuthUtil.ROLE_NAME));
      String userName = Func.toStr(claims.get(AuthUtil.USER_NAME));
      String nickName = Func.toStr(claims.get(AuthUtil.NICK_NAME));
      String tenantName = Func.toStr(claims.get("tenantName"));
      String email = Func.toStr(claims.get("email"));
      String deptName = Func.toStr(claims.get("deptName"));
      String secretGrade = Func.toStr(claims.get("secretGrade"));
      Kv detail = Kv.create().setAll((Map<? extends String, ?>) claims.get(AuthUtil.DETAIL));
      BladeUser bladeUser = new BladeUser();
      bladeUser.setClientId(clientId);
      bladeUser.setUserId(userId);
      bladeUser.setTenantId(tenantId);
      bladeUser.setOauthId(oauthId);
      bladeUser.setAccount(account);
      bladeUser.setDeptId(deptId);
      bladeUser.setPostId(postId);
      bladeUser.setRoleId(roleId);
      bladeUser.setRoleName(roleName);
      bladeUser.setUserName(userName);
      bladeUser.setNickName(nickName);
      detail.put("tenantName",tenantName);
      detail.put("deptName",deptName);
      detail.put("email",email);
      detail.put("secretGrade",secretGrade);
      bladeUser.setDetail(detail);
      return bladeUser;
   }
   /**
    * æ˜¯å¦ä¸ºè¶…管
    *
    * @return boolean
    */
   public static boolean isAdministrator() {
      return StringUtil.containsAny(getUserRole(), RoleConstant.ADMINISTRATOR);
   }
   /**
    * æ˜¯å¦ä¸ºç®¡ç†å‘˜
    *
    * @return boolean
    */
   public static boolean isAdmin() {
      return StringUtil.containsAny(getUserRole(), RoleConstant.ADMIN);
   }
   /**
    * èŽ·å–ç”¨æˆ·id
    *
    * @return userId
    */
   public static Long getUserId() {
      BladeUser user = getUser();
      return (null == user) ? -1 : user.getUserId();
   }
   /**
    * èŽ·å–ç”¨æˆ·id
    *
    * @param request request
    * @return userId
    */
   public static Long getUserId(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? -1 : user.getUserId();
   }
   /**
    * èŽ·å–ç”¨æˆ·è´¦å·
    *
    * @return userAccount
    */
   public static String getUserAccount() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getAccount();
   }
   /**
    * èŽ·å–ç”¨æˆ·è´¦å·
    *
    * @param request request
    * @return userAccount
    */
   public static String getUserAccount(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getAccount();
   }
   /**
    * èŽ·å–ç”¨æˆ·å
    *
    * @return userName
    */
   public static String getUserName() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getUserName();
   }
   /**
    * èŽ·å–ç”¨æˆ·å
    *
    * @param request request
    * @return userName
    */
   public static String getUserName(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getUserName();
   }
   /**
    * èŽ·å–æ˜µç§°
    *
    * @return userName
    */
   public static String getNickName() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getNickName();
   }
   /**
    * èŽ·å–æ˜µç§°
    *
    * @param request request
    * @return userName
    */
   public static String getNickName(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getNickName();
   }
   /**
    * èŽ·å–ç”¨æˆ·éƒ¨é—¨
    *
    * @return userName
    */
   public static String getDeptId() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getDeptId();
   }
   /**
    * èŽ·å–ç”¨æˆ·éƒ¨é—¨
    *
    * @param request request
    * @return userName
    */
   public static String getDeptId(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getDeptId();
   }
   /**
    * èŽ·å–ç”¨æˆ·å²—ä½
    *
    * @return userName
    */
   public static String getPostId() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getPostId();
   }
   /**
    * èŽ·å–ç”¨æˆ·å²—ä½
    *
    * @param request request
    * @return userName
    */
   public static String getPostId(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getPostId();
   }
   /**
    * èŽ·å–ç”¨æˆ·è§’è‰²
    *
    * @return userName
    */
   public static String getUserRole() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getRoleName();
   }
   /**
    * èŽ·å–ç”¨è§’è‰²
    *
    * @param request request
    * @return userName
    */
   public static String getUserRole(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getRoleName();
   }
   /**
    * èŽ·å–ç§Ÿæˆ·ID
    *
    * @return tenantId
    */
   public static String getTenantId() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getTenantId();
   }
   /**
    * èŽ·å–ç§Ÿæˆ·ID
    *
    * @param request request
    * @return tenantId
    */
   public static String getTenantId(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getTenantId();
   }
   /**
    * èŽ·å–ç¬¬ä¸‰æ–¹è®¤è¯ID
    *
    * @return tenantId
    */
   public static String getOauthId() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getOauthId();
   }
   /**
    * èŽ·å–ç¬¬ä¸‰æ–¹è®¤è¯ID
    *
    * @param request request
    * @return tenantId
    */
   public static String getOauthId(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getOauthId();
   }
   /**
    * èŽ·å–å®¢æˆ·ç«¯id
    *
    * @return clientId
    */
   public static String getClientId() {
      BladeUser user = getUser();
      return (null == user) ? StringPool.EMPTY : user.getClientId();
   }
   /**
    * èŽ·å–å®¢æˆ·ç«¯id
    *
    * @param request request
    * @return clientId
    */
   public static String getClientId(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? StringPool.EMPTY : user.getClientId();
   }
   /**
    * èŽ·å–ç”¨æˆ·è¯¦æƒ…
    *
    * @return clientId
    */
   public static Kv getDetail() {
      BladeUser user = getUser();
      return (null == user) ? Kv.create() : user.getDetail();
   }
   /**
    * èŽ·å–ç”¨æˆ·è¯¦æƒ…
    *
    * @param request request
    * @return clientId
    */
   public static Kv getDetail(HttpServletRequest request) {
      BladeUser user = getUser(request);
      return (null == user) ? Kv.create() : user.getDetail();
   }
   /**
    * èŽ·å–Claims
    *
    * @param request request
    * @return Claims
    */
   public static Claims getClaims(HttpServletRequest request) {
      String auth = request.getHeader(AuthUtil.HEADER);
      Claims claims = null;
      String token;
      // èŽ·å– Token å‚æ•°
      if (StringUtil.isNotBlank(auth)) {
         token = JwtUtil.getToken(auth);
      } else {
         String parameter = request.getParameter(AuthUtil.HEADER);
         token = JwtUtil.getToken(parameter);
      }
      // èŽ·å– Token å€¼
      if (StringUtil.isNotBlank(token)) {
         claims = AuthUtil.parseJWT(token);
      }
      // åˆ¤æ–­ Token çŠ¶æ€
      if (ObjectUtil.isNotEmpty(claims) && getJwtProperties().getState()) {
         String tenantId = Func.toStr(claims.get(AuthUtil.TENANT_ID));
         String userId = Func.toStr(claims.get(AuthUtil.USER_ID));
         String accessToken = JwtUtil.getAccessToken(tenantId, userId, token);
         if (!token.equalsIgnoreCase(accessToken)) {
            return null;
         }
      }
      return claims;
   }
   /**
    * èŽ·å–è¯·æ±‚å¤´
    *
    * @return header
    */
   public static String getHeader() {
      return getHeader(Objects.requireNonNull(WebUtil.getRequest()));
   }
   /**
    * èŽ·å–è¯·æ±‚å¤´
    *
    * @param request request
    * @return header
    */
   public static String getHeader(HttpServletRequest request) {
      return request.getHeader(HEADER);
   }
   /**
    * è§£æžjsonWebToken
    *
    * @param jsonWebToken jsonWebToken
    * @return Claims
    */
   public static Claims parseJWT(String jsonWebToken) {
      return JwtUtil.parseJWT(jsonWebToken);
   }
}