From 6bade716cb9755436e465060e66c7dbed8ca7c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Tue, 8 Apr 2025 10:36:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=88=87=E6=8D=A2=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/sa/MyStpLogic.java | 40 +++++++++++++++++-- .../account/service/AuthorizationService.java | 6 +++ .../impl/AuthorizationServiceImpl.java | 38 ++++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java index 43e9728b..a566421c 100644 --- a/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java +++ b/cash-common/cash-common-sa-token/src/main/java/com/czg/sa/MyStpLogic.java @@ -17,6 +17,7 @@ import cn.hutool.core.util.StrUtil; import com.czg.exception.ApiNotPrintException; import com.czg.exception.CzgException; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import java.util.function.Consumer; /** * @author Administrator */ +@Slf4j @Getter public class MyStpLogic { public static final StpLogic CLIENT_LOGIC = new StpLogic("client"); @@ -53,6 +55,29 @@ public class MyStpLogic { } } + /** + * 身份切换 + * @param id 用户id + * @param account 账户名 + * @param shopId 店铺id + * @param shopName 店铺名称 + * @param loginType 登录类型 + * @param isAdmin 是否管理员 + */ + public void switchTo(Long id, String account, Long shopId, String shopName, LoginType loginType, boolean isAdmin) { + StpLogic logic = getLogic(); + long headId = logic.getLoginIdAsLong(); + SaSession session = logic.getSession(); + Object parentId1 = session.get("headId"); + if (parentId1 == null) { + session.set("headId", headId); + } + session.set("userId", id).set("isAdmin", isAdmin).set("isManager", loginType.equals(LoginType.MANAGER)) + .set("loginType", loginType).set("account", account).set("shopId", shopId).set("shopName", shopName); + + logic.getSaTokenDao().set(splicingKeyTokenValue(logic.getTokenValue()), id.toString(), logic.getTokenTimeout()); + } + /** * @param id 登录账号id * @param shopName 店铺名称 @@ -83,6 +108,8 @@ public class MyStpLogic { SaManager.getSaTokenDao().set(SaManager.getConfig().getTokenName() + ":" + token, String.valueOf(id), SaManager.getConfig().getTimeout()); } + + /** * 获取当前登录账号名称 管理端为用户账号 客户端为openId * @@ -104,6 +131,15 @@ public class MyStpLogic { return shopName instanceof String s ? s : null; } + /** + * 获取主店铺id + * @return id + */ + public Long getHeadId() { + Object headId = getLogic().getSession().get("headId"); + return headId == null ? null : Long.parseLong(headId.toString()); + } + /** * 获取店铺id * @@ -901,9 +937,7 @@ public class MyStpLogic { } - public void switchTo(Object loginId) { - getLogic().switchTo(loginId); - } + public void endSwitch() { diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java index 14242000..1a666340 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/AuthorizationService.java @@ -11,4 +11,10 @@ public interface AuthorizationService { Object getCaptcha(); LoginVO login(SysLoginDTO loginDTO, String platformType); + + /** + * 切换登录用户 + * @param sysUserId 系统用户id + */ + void switchTo(Long sysUserId); } diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java index 624b23fb..156a5475 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/AuthorizationServiceImpl.java @@ -12,6 +12,7 @@ import com.czg.account.vo.LoginVO; import com.czg.config.RedisCst; import com.czg.enums.PlatformTypeEnum; import com.czg.enums.StatusEnum; +import com.czg.enums.YesNoEnum; import com.czg.exception.ApiNotPrintException; import com.czg.sa.MyStpLogic; import com.czg.sa.StpKit; @@ -173,6 +174,43 @@ public class AuthorizationServiceImpl implements AuthorizationService { return new LoginVO(StpKit.USER.getTokenInfo(), new ArrayList<>(), loginDTO.loginType(), shopInfo); } + @Override + public void switchTo(Long sysUserId) { + Long headId = StpKit.USER.getHeadId(); + long shopId = StpKit.USER.getLoginIdAsLong(); + ShopInfo currentInfo = shopInfoService.getById(shopId); + if (currentInfo.getIsHeadShop() != YesNoEnum.YES.value() && headId == null) { + throw new ApiNotPrintException("登录账号无权限切换"); + } + + SysUser sysUser = sysUserService.getById(sysUserId); + if (sysUser == null) { + throw new ApiNotPrintException("用户不存在"); + } + + ShopInfo shopInfo = shopInfoService.getById(sysUser.getId()); + if (shopInfo == null) { + throw new ApiNotPrintException("店铺信息不存在"); + } + + if (!shopInfo.getMainId().equals(headId)) { + throw new ApiNotPrintException("目标店铺非登录账号所有"); + } + + // 查询角色 + List roleList = sysRoleService.getByUserId(sysUser.getId()); + List roleNames = roleList.stream().map(SysRole::getName).collect(Collectors.toList()); + if (sysUser.getIsAdmin()) { + roleNames.add("admin"); + } + StpKit.USER.addRoleList(roleNames); + // 权限赋予 + List promissionList = sysMenuMapper.selectByUserId(sysUser.getId(), null).stream().map(SysMenu::getPermission).filter(StrUtil::isNotBlank).toList(); + StpKit.USER.switchTo(sysUser.getId(), sysUser.getAccount(), shopInfo.getId(), shopInfo.getShopName(), MyStpLogic.LoginType.MANAGER, sysUser.getIsAdmin()); + StpKit.USER.addPermissionList(promissionList); + StpKit.USER.addRoleList(roleNames); + } + @NotNull private static HandoverRecord getHandoverRecord(boolean isStaff, ShopInfo shopInfo, ShopStaff shopStaff) { HandoverRecord entity = new HandoverRecord();