Эх сурвалжийг харах

feat(user): 引入用户上下文管理器以统一用户信息获取- 新增 UserContext 类用于存储和获取当前登录用户信息
- 在拦截器中设置 UserContext 并在请求结束后清除- 替换多处通过 StpUtil.getSession() 获取用户属性的方式
- 新增 LoginUser 类封装用户基本信息
- 配置 WebMvcConfig 注册 UserContextInterceptor 拦截器- 更新 bootstrap.yml 添加忽略和登录 URL 配置项
- 补充 UserConstants 中缺失的租户名称常量定义

chejianzheng 6 өдөр өмнө
parent
commit
a27d999204

+ 1 - 0
portal-service-common/src/main/java/com/hfln/portal/common/constant/UserConstants.java

@@ -15,6 +15,7 @@ public interface UserConstants {
     String SA_USER_NAME = "user_name";
     String SA_USER_TENANT_ID = "user_tenant_id";
     String SA_USER_TENANT_CODE = "user_tenant_code";
+    String SA_USER_TENANT_NAME = "user_tenant_name";
     String SA_USER_ACCOUNT = "user_account";
 
     // 用户默认角色code

+ 28 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/config/LoginUser.java

@@ -0,0 +1,28 @@
+package com.hfln.portal.infrastructure.config;
+
+import lombok.Data;
+
+@Data
+public class LoginUser {
+
+    private Long userId;
+
+    private String userName;
+
+    private String userType;
+
+    private String account;
+
+    private Long tenantId;
+
+    private String tenantCode;
+
+    private String tenantName;
+
+    private String phone;
+
+    private String openId;
+
+    private String unionId;
+
+}

+ 1 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/config/MybatisPlusMetaObjectHandler.java

@@ -69,7 +69,7 @@ public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {
     private Long getUserId() {
         try {
             // 使用Sa-Token获取当前登录用户ID
-            return StpUtil.getSession().getLong(UserConstants.SA_USER_ID);
+            return UserContext.getUserId();
         } catch (Exception e) {
             log.warn("获取当前用户ID失败");
             return 0L;

+ 138 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/config/UserContext.java

@@ -0,0 +1,138 @@
+package com.hfln.portal.infrastructure.config;
+
+public class UserContext {
+    private static final ThreadLocal<LoginUser> loginUserHolder = new ThreadLocal<>();
+
+    public static void set(LoginUser loginUser) {
+        loginUserHolder.set(loginUser);
+    }
+
+    public static LoginUser get() {
+        return loginUserHolder.get();
+    }
+
+    public static void clear() {
+        loginUserHolder.remove();
+    }
+
+    public static Long getUserId() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getUserId();
+    }
+
+    public static String getPhone() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getPhone();
+    }
+
+    public static String getOpenId() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getOpenId();
+    }
+
+    public static String getUnionId() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getUnionId();
+    }
+
+    public static String getUserName() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getUserName();
+    }
+
+    public static String getUserType() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getUserType();
+    }
+
+    public static Long getTenantId() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getTenantId();
+    }
+
+    public static String getTenantCode() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getTenantCode();
+    }
+
+    public static String getAccount() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getAccount();
+    }
+
+    public static String getTenantName() {
+        LoginUser loginUser = loginUserHolder.get();
+        return loginUser == null ? null : loginUser.getTenantName();
+    }
+
+    public static void setTenantName(String tenantName) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setTenantName(tenantName);
+        }
+    }
+
+    public static void setUserId(Long userId) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setUserId(userId);
+        }
+    }
+    
+    public static void setPhone(String phone) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setPhone(phone);
+        }
+    }
+    
+    public static void setOpenId(String openId) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setOpenId(openId);
+        }
+    }
+    
+    public static void setUnionId(String unionId) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setUnionId(unionId);
+        }
+    }
+    
+    public static void setUserName(String userName) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setUserName(userName);
+        }
+    }
+    
+    public static void setUserType(String userType) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setUserType(userType);
+        }
+    }
+    
+    public static void setTenantId(Long tenantId) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setTenantId(tenantId);
+        }
+    }
+    
+    public static void setTenantCode(String tenantCode) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setTenantCode(tenantCode);
+        }
+    }
+    
+    public static void setAccount(String account) {
+        LoginUser loginUser = loginUserHolder.get();
+        if (loginUser != null) {
+            loginUser.setAccount(account);
+        }
+    }
+
+}

+ 39 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/config/UserContextInterceptor.java

@@ -0,0 +1,39 @@
+package com.hfln.portal.infrastructure.config;
+
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.stp.StpUtil;
+import com.hfln.portal.common.constant.UserConstants;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class UserContextInterceptor implements HandlerInterceptor {
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        // 从Session中获取租户ID并设置到ThreadLocal中
+        LoginUser loginUser = new LoginUser();
+        SaSession saSession = StpUtil.getSession();
+        loginUser.setTenantId((Long) saSession.get(UserConstants.SA_USER_TENANT_ID));
+        loginUser.setTenantName((String) saSession.get(UserConstants.SA_USER_TENANT_NAME));
+        loginUser.setTenantCode((String) saSession.get(UserConstants.SA_USER_TENANT_CODE));
+        loginUser.setUserId((Long) saSession.get(UserConstants.SA_USER_ID));
+        loginUser.setUserName((String) saSession.get(UserConstants.SA_USER_NAME));
+        loginUser.setUserType((String) saSession.get(UserConstants.SA_USER_TYPE));
+        loginUser.setAccount((String) saSession.get(UserConstants.SA_USER_ACCOUNT));
+        loginUser.setPhone((String) saSession.get(UserConstants.SA_USER_PHONE));
+        loginUser.setOpenId((String) saSession.get(UserConstants.SA_USER_OPEN_ID));
+        loginUser.setUnionId((String) saSession.get(UserConstants.SA_USER_UNION_ID));
+        UserContext.set(loginUser);
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
+        // 请求完成后清理ThreadLocal
+        UserContext.clear();
+    }
+}

+ 31 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/config/WebMvcConfig.java

@@ -0,0 +1,31 @@
+package com.hfln.portal.infrastructure.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.List;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private UserContextInterceptor userContextInterceptor;
+
+    @Value("#{'${portal.service.loginUrls}'.split(',')}")
+    private List<String> loginUrls;
+
+    @Value("#{'${portal.service.ignoreUrls}'.split(',')}")
+    private List<String> ignoreUrls;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(userContextInterceptor)
+                .addPathPatterns("/**")
+                .excludePathPatterns(ignoreUrls)
+                .excludePathPatterns(loginUrls); // 根据实际需求指定路径
+    }
+}
+

+ 3 - 2
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/DeviceGatewayImpl.java

@@ -31,6 +31,7 @@ import com.hfln.portal.domain.customer.util.PhoneUtils;
 import com.hfln.portal.domain.exception.ErrorEnum;
 import com.hfln.portal.domain.gateway.AlarmGateway;
 import com.hfln.portal.domain.gateway.DeviceGateway;
+import com.hfln.portal.infrastructure.config.UserContext;
 import com.hfln.portal.infrastructure.mqtt.MqttClient;
 import com.hfln.portal.infrastructure.mqtt.MqttSend;
 import com.hfln.portal.infrastructure.oss.OssClient;
@@ -338,12 +339,12 @@ public class DeviceGatewayImpl implements DeviceGateway {
 
         // 2.构建 Redis key  和 当前处理人
         String redisKey = RedisCacheConstant.FALLING_EVENTS_KEY_PRE + ":" + eventListId;
-        String userId = String.valueOf(StpUtil.getSession().get(UserConstants.SA_USER_ID));
+        String userId = String.valueOf(UserContext.getUserId());
 
         // 3.如果事件未处理
         if (eventList.getIsHandle() == 0) {
             // 获取当前处理者手机号
-            String phone = String.valueOf(StpUtil.getSession().get(UserConstants.SA_USER_PHONE));
+            String phone = UserContext.getPhone();
 
             LambdaUpdateWrapper<EventList> updateWrapper = new LambdaUpdateWrapper<>();
             updateWrapper.eq(EventList::getEventListId, eventListId)

+ 2 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/StatsGatewayImpl.java

@@ -11,6 +11,7 @@ import com.hfln.portal.common.request.event.WapEventsParams;
 import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.domain.customer.util.CopyUtils;
 import com.hfln.portal.domain.gateway.StatsGateway;
+import com.hfln.portal.infrastructure.config.UserContext;
 import com.hfln.portal.infrastructure.po.EventList;
 import com.hfln.portal.infrastructure.po.Events;
 import com.hfln.portal.infrastructure.service.DevInfoService;
@@ -57,7 +58,7 @@ public class StatsGatewayImpl implements StatsGateway {
     @Override
     public PageRecord<EventsDTO> alarmEventsQuery(WapEventsParams params) {
         // 1.从会话中获取当前用户的id
-        Long userId = StpUtil.getSession().getLong(UserConstants.SA_USER_ID);
+        Long userId = UserContext.getUserId();
 
         // 2.根据userId获取用户自己设备与被分享设备的id
         //2.1 获取用户被分享的设备id集合  sharedDevIds

+ 7 - 5
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebGatewayImpl.java

@@ -32,6 +32,7 @@ import com.hfln.portal.domain.exception.ErrorEnum;
 import com.hfln.portal.domain.gateway.WebGateway;
 import com.hfln.portal.domain.gateway.sms.SmsGateway;
 import com.hfln.portal.infrastructure.config.UserAuthService;
+import com.hfln.portal.infrastructure.config.UserContext;
 import com.hfln.portal.infrastructure.po.*;
 import com.hfln.portal.infrastructure.service.*;
 import com.hfln.portal.infrastructure.oss.OssClient;
@@ -233,7 +234,7 @@ public class WebGatewayImpl implements WebGateway {
         }
 
         // 执行分页查询
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
+        Long tenantId = UserContext.getTenantId();
         if (tenantId == null){
             tenantId = queryReq.getTenantId();
         }
@@ -342,6 +343,8 @@ public class WebGatewayImpl implements WebGateway {
         TblTenant tenant = null;
         if (adminUser.getTenantId() != null) {
             tenant = tblTenantService.getById(adminUser.getTenantId());
+            saSession.set(UserConstants.SA_USER_TENANT_NAME, tenant.getTenantName());
+            saSession.set(UserConstants.SA_USER_TENANT_CODE, tenant.getTenantCode());
         }
 
 
@@ -435,8 +438,8 @@ public class WebGatewayImpl implements WebGateway {
     @Override
     public void addRole(AddRoleParam param) {
 
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
+        String userType = UserContext.getUserType();
+        Long tenantId = UserContext.getTenantId();
         if (AdminUserType.getBgManagerTypes().contains(userType)) {
             tenantId = param.getTenantId();
         }
@@ -486,8 +489,7 @@ public class WebGatewayImpl implements WebGateway {
     @Override
     public List<RoleListDTO> roleList(QueryRoleParam param) {
 
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
+        Long tenantId = UserContext.getTenantId();
 
         // 1. 查询所有未被删除的角色
         LambdaQueryWrapper<TblRole> queryWrapper = new LambdaQueryWrapper<>();

+ 5 - 4
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebStatsGatewayImpl.java

@@ -23,6 +23,7 @@ import com.hfln.portal.common.vo.PageRecord;
 import com.hfln.portal.domain.customer.AdminUserType;
 import com.hfln.portal.domain.customer.util.CopyUtils;
 import com.hfln.portal.domain.gateway.WebStatsGateway;
+import com.hfln.portal.infrastructure.config.UserContext;
 import com.hfln.portal.infrastructure.po.*;
 import com.hfln.portal.infrastructure.service.*;
 import lombok.extern.slf4j.Slf4j;
@@ -65,8 +66,8 @@ public class WebStatsGatewayImpl implements WebStatsGateway {
 
     @Override
     public PageRecord<EventListDTO> fallQuery(EventListParams params) {
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
+        Long tenantId = UserContext.getTenantId();
+        String userType = UserContext.getUserType();
 
         if (AdminUserType.getBgManagerTypes().contains(userType)) {
             tenantId = params.getTenantId();
@@ -93,8 +94,8 @@ public class WebStatsGatewayImpl implements WebStatsGateway {
     @Override
     public PageRecord<EventsDTO> alarmEventsQuery(WebEventsParams params) {
         // 1.获取当前用户信息
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
+        Long tenantId = UserContext.getTenantId();
+        String userType = UserContext.getUserType();
 
         // 2.调用web端查询告警信息 queryEvents 方法
         return eventsService.queryEvents(params, userType, tenantId);

+ 8 - 7
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/WebUserGatewayImpl.java

@@ -16,6 +16,7 @@ import com.hfln.portal.domain.customer.util.CopyUtils;
 import com.hfln.portal.domain.customer.util.PasswordUtil;
 import com.hfln.portal.domain.exception.ErrorEnum;
 import com.hfln.portal.domain.gateway.WebUserGateway;
+import com.hfln.portal.infrastructure.config.UserContext;
 import com.hfln.portal.infrastructure.po.AdminUserInfo;
 import com.hfln.portal.infrastructure.po.TblUserRole;
 import com.hfln.portal.infrastructure.service.AdminUserService;
@@ -49,8 +50,8 @@ public class WebUserGatewayImpl implements WebUserGateway {
     public PageRecord<AdminUserDto> queryManager(QueryManagerParam param) {
 
         // 对 后台超级管理员 和用户超级管理员 进行权限控制
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
+        String userType = UserContext.getUserType();
+        Long tenantId = UserContext.getTenantId();
         log.info("当前登录用户类型:userType:{}, tenantId:{}", userType, tenantId);
         if (tenantId != null) {
             param.setTenantId(tenantId);
@@ -67,7 +68,7 @@ public class WebUserGatewayImpl implements WebUserGateway {
     @Transactional
     public void addManager(AddAccountParam param) {
 
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
+        Long tenantId = UserContext.getTenantId();
         if (tenantId != null) {
             param.setTenantId(tenantId);
         }
@@ -78,7 +79,7 @@ public class WebUserGatewayImpl implements WebUserGateway {
         }
 
         // 对 后台超级管理员 和用户超级管理员 进行权限控制
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
+        String userType = UserContext.getUserType();
         log.info("当前登录用户类型:userType:{}", userType);
 
         // 如果创建的用户类型为普通用户,则需要指定租户id
@@ -106,7 +107,7 @@ public class WebUserGatewayImpl implements WebUserGateway {
     @Transactional
     public void modManager(AdminModParam param) {
 
-        Long tenantId = (Long) StpUtil.getSession().get(UserConstants.SA_USER_TENANT_ID);
+        Long tenantId = UserContext.getTenantId();
         if (tenantId != null) {
             param.setTenantId(tenantId);
         }
@@ -124,7 +125,7 @@ public class WebUserGatewayImpl implements WebUserGateway {
         }
 
         // 对 后台超级管理员 和用户超级管理员 进行权限控制
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
+        String userType = UserContext.getUserType();
         log.info("当前登录用户类型:userType:{}", userType);
 
         // 如果修改的用户类型为普通用户,则需要指定租户id
@@ -159,7 +160,7 @@ public class WebUserGatewayImpl implements WebUserGateway {
             throw new BizException(ErrorEnum.USER_IS_NOT_EXIST.getErrorCode(), ErrorEnum.USER_IS_NOT_EXIST.getErrorMessage());
         }
         // 对 后台超级管理员 和用户超级管理员 进行权限控制
-        String userType = (String) StpUtil.getSession().get(UserConstants.SA_USER_TYPE);
+        String userType = UserContext.getUserType();
         log.info("当前登录用户类型:userType:{}", userType);
 
         check(userType, exist.getUserType());

+ 7 - 1
portal-service-server/src/main/resources/bootstrap.yml

@@ -47,4 +47,10 @@ lnxx:
      license: Apache 2.0
      license-url: https://www.apache.org/licenses/LICENSE-2.0.html
      terms-of-service-url: https://www.hfln.com/terms
-     enable-security: true
+     enable-security: true
+
+
+portal:
+  service:
+    ignoreUrls: /wap/user/**,/v2/**,/doc.html,/swagger-resources/**,/webjars/**,/swagger-ui/**,/swagger-ui.html,/v3/**,/*/v3/**,/api-docs/**,/api/doc.html,/knife4j/**,/*/appspecific/**,/favicon.ico/**
+    loginUrls: /web/user/login,/web/user/reset,/web/user/sendCode,/wap/user/wx/loginByPhone,/wap/user/loginWx,/wap/user/loginBySmsCode,/wap/user/getLoginSmsCode,/wap/wechat/authUrl,/wap/wechat/callback,/wap/wechat/serverCheck