Browse Source

feat(auth): 增加用户未登录异常处理

- 在ErrorEnum中新增USER_NOT_LOGIN错误码和提示信息
- 在UserContextInterceptor中增加登录状态检查逻辑
- 未登录时抛出BizException异常并记录日志
- 增加try-catch处理用户上下文设置异常情况
- 在bootstrap.yml的loginUrls中增加/error路径配置
chejianzheng 2 days ago
parent
commit
e582fb14ec

+ 1 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/exception/ErrorEnum.java

@@ -42,6 +42,7 @@ public enum ErrorEnum implements ErrorEnumInterface {
     USER_INFO_ERROR("30009", "用户信息有误,请联系管理员!"),
     OPR_NOT_ALLOWED("30010", "用户禁止当前操作!"),
     USER_FWH_IS_NULL("30011", "用户服务号id为空"),
+    USER_NOT_LOGIN("30012", "用户未登录"),
 
     /**
      * 三方系统调用相关

+ 35 - 15
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/config/UserContextInterceptor.java

@@ -2,33 +2,53 @@ package com.hfln.portal.infrastructure.config;
 
 import cn.dev33.satoken.session.SaSession;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hfln.framework.extension.BizException;
 import com.hfln.portal.common.constant.UserConstants;
+import com.hfln.portal.domain.exception.ErrorEnum;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+@Slf4j
 @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));
-        loginUser.setRoleId((Long) saSession.get(UserConstants.SA_USER_ROLE_ID));
-        UserContext.set(loginUser);
+
+        // 检查用户是否登录
+        if (!StpUtil.isLogin()) {
+            log.error("用户未登录,跳过UserContext设置");
+            throw new BizException(ErrorEnum.USER_NOT_LOGIN.getErrorCode(), ErrorEnum.USER_NOT_LOGIN.getErrorMessage());
+
+        }
+        try {
+
+            // 从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));
+            loginUser.setRoleId((Long) saSession.get(UserConstants.SA_USER_ROLE_ID));
+            UserContext.set(loginUser);
+        } catch (Exception e) {
+            log.error("设置用户上下文信息异常", e);
+            // 即使出现异常也继续执行请求
+            UserContext.clear();
+            throw new BizException(ErrorEnum.USER_INFO_ERROR.getErrorCode(), ErrorEnum.USER_INFO_ERROR.getErrorMessage());
+        }
+
         return true;
     }
 

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

@@ -53,4 +53,4 @@ lnxx:
 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
+    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,/error