|
@@ -1,12 +1,14 @@
|
|
|
package org.dromara.web.service;
|
|
|
|
|
|
import cn.dev33.satoken.exception.NotLoginException;
|
|
|
+import cn.dev33.satoken.stp.SaLoginModel;
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.lang.Opt;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.lock.annotation.Lock4j;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import me.zhyd.oauth.model.AuthUser;
|
|
@@ -16,6 +18,7 @@ import org.dromara.common.core.constant.SystemConstants;
|
|
|
import org.dromara.common.core.constant.TenantConstants;
|
|
|
import org.dromara.common.core.domain.dto.PostDTO;
|
|
|
import org.dromara.common.core.domain.dto.RoleDTO;
|
|
|
+import org.dromara.common.core.domain.model.LoginBody;
|
|
|
import org.dromara.common.core.domain.model.LoginUser;
|
|
|
import org.dromara.common.core.enums.LoginType;
|
|
|
import org.dromara.common.core.exception.ServiceException;
|
|
@@ -63,6 +66,7 @@ public class SysLoginService {
|
|
|
private final ISysDeptService deptService;
|
|
|
private final ISysPostService postService;
|
|
|
private final SysUserMapper userMapper;
|
|
|
+ private final ISysClientService clientService;
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -151,14 +155,15 @@ public class SysLoginService {
|
|
|
public LoginUser buildLoginUser(SysUserVo user) {
|
|
|
LoginUser loginUser = new LoginUser();
|
|
|
Long userId = user.getUserId();
|
|
|
- loginUser.setTenantId(user.getTenantId());
|
|
|
+ String tenantId = user.getTenantId();
|
|
|
+ loginUser.setTenantId(tenantId);
|
|
|
loginUser.setUserId(userId);
|
|
|
loginUser.setDeptId(user.getDeptId());
|
|
|
loginUser.setUsername(user.getUserName());
|
|
|
loginUser.setNickname(user.getNickName());
|
|
|
loginUser.setUserType(user.getUserType());
|
|
|
- loginUser.setMenuPermission(permissionService.getMenuPermission(userId));
|
|
|
- loginUser.setRolePermission(permissionService.getRolePermission(userId));
|
|
|
+ loginUser.setMenuPermission(permissionService.getMenuPermission(userId,tenantId));
|
|
|
+ loginUser.setRolePermission(permissionService.getRolePermission(userId,tenantId));
|
|
|
if (ObjectUtil.isNotNull(user.getDeptId())) {
|
|
|
Opt<SysDeptVo> deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById);
|
|
|
loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY));
|
|
@@ -171,6 +176,38 @@ public class SysLoginService {
|
|
|
return loginUser;
|
|
|
}
|
|
|
|
|
|
+/* *//**
|
|
|
+ * 构建登录用户
|
|
|
+ *//*
|
|
|
+ public LoginUser buildLoginUserByTenantId(SysUserVo user) {
|
|
|
+ LoginUser loginUser = new LoginUser();
|
|
|
+ Long userId = user.getUserId();
|
|
|
+ loginUser.setTenantId(user.getTenantId());
|
|
|
+ loginUser.setUserId(userId);
|
|
|
+ loginUser.setDeptId(user.getDeptId());
|
|
|
+ loginUser.setUsername(user.getUserName());
|
|
|
+ loginUser.setNickname(user.getNickName());
|
|
|
+ loginUser.setUserType(user.getUserType());
|
|
|
+
|
|
|
+ Set<String> menuPermission = TenantHelper.ignore(() -> { return permissionService.getMenuPermission(userId); });
|
|
|
+ loginUser.setMenuPermission(menuPermission);
|
|
|
+ Set<String> rolePermission = TenantHelper.ignore(() -> { return permissionService.getRolePermission(userId); });
|
|
|
+ loginUser.setRolePermission(rolePermission);
|
|
|
+ if (ObjectUtil.isNotNull(user.getDeptId())) {
|
|
|
+ SysDeptVo sysDeptVo =TenantHelper.ignore(() -> { return deptService.selectDeptById(user.getDeptId()); });
|
|
|
+ loginUser.setDeptName(sysDeptVo.getDeptName());
|
|
|
+ loginUser.setDeptCategory(sysDeptVo.getDeptCategory());
|
|
|
+*//* Opt<SysDeptVo> deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById);
|
|
|
+ loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY));
|
|
|
+ loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY));*//*
|
|
|
+ }
|
|
|
+ List<SysRoleVo> roles =TenantHelper.ignore(() -> { return roleService.selectRolesByUserId(userId); });
|
|
|
+ List<SysPostVo> posts =TenantHelper.ignore(() -> { return postService.selectPostsByUserId(userId); });
|
|
|
+ loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
|
|
|
+ loginUser.setPosts(BeanUtil.copyToList(posts, PostDTO.class));
|
|
|
+ return loginUser;
|
|
|
+ }*/
|
|
|
+
|
|
|
/**
|
|
|
* 记录登录信息
|
|
|
*
|
|
@@ -248,4 +285,47 @@ public class SysLoginService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 动态切换租户
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ */
|
|
|
+ public String getLoginVo(LoginBody loginBody) {
|
|
|
+ String clientId = loginBody.getClientId();
|
|
|
+ SysClientVo client = clientService.queryByClientId(clientId);
|
|
|
+ String tenantId = loginBody.getTenantId();
|
|
|
+ String username = LoginHelper.getUsername();
|
|
|
+ SysUserVo user = TenantHelper.ignore(() -> {
|
|
|
+ return loadUserByUsername(username);
|
|
|
+ });
|
|
|
+ LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
|
|
|
+ user.setTenantId(tenantId);
|
|
|
+ // 此处可根据登录用户的数据不同 自行创建 loginUser
|
|
|
+ return buildLoginUser(user);
|
|
|
+ });
|
|
|
+ loginUser.setClientKey(client.getClientKey());
|
|
|
+ loginUser.setDeviceType(client.getDeviceType());
|
|
|
+ SaLoginModel model = new SaLoginModel();
|
|
|
+ model.setDevice(client.getDeviceType());
|
|
|
+ // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
|
|
|
+ // 例如: 后台用户30分钟过期 app用户1天过期
|
|
|
+ model.setTimeout(client.getTimeout());
|
|
|
+ model.setActiveTimeout(client.getActiveTimeout());
|
|
|
+ model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
|
|
|
+ // 生成token
|
|
|
+ LoginHelper.login(loginUser, model);
|
|
|
+ return StpUtil.getTokenValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ private SysUserVo loadUserByUsername(String username) {
|
|
|
+ SysUserVo user =TenantHelper.ignore(() -> { return userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username)); });
|
|
|
+ if (ObjectUtil.isNull(user)) {
|
|
|
+ log.info("登录用户:{} 不存在.", username);
|
|
|
+ throw new UserException("user.not.exists", username);
|
|
|
+ } else if (SystemConstants.DISABLE.equals(user.getStatus())) {
|
|
|
+ log.info("登录用户:{} 已被停用.", username);
|
|
|
+ throw new UserException("user.blocked", username);
|
|
|
+ }
|
|
|
+ return user;
|
|
|
+ }
|
|
|
}
|