Commit e9ff696a authored by 施翔轲's avatar 施翔轲

三方平台跳转登录相关改造

parent 8e8fb36d
...@@ -2,28 +2,21 @@ package com.dsk.web.controller.system; ...@@ -2,28 +2,21 @@ package com.dsk.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.RegexPool; import cn.hutool.core.lang.RegexPool;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.ReUtil;
import com.dsk.common.constant.Constants; import com.dsk.common.constant.Constants;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.exception.ServiceException; import com.dsk.common.core.domain.model.*;
import com.dsk.common.tenant.helper.TenantHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils; import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.jsk.util.IpUtil; import com.dsk.jsk.util.IpUtil;
import com.dsk.system.domain.SysMenu; import com.dsk.system.domain.SysMenu;
import com.dsk.system.domain.SysUser; import com.dsk.system.domain.SysUser;
import com.dsk.common.core.domain.model.EmailLoginBody;
import com.dsk.common.core.domain.model.LoginBody;
import com.dsk.common.core.domain.model.LoginUser;
import com.dsk.common.core.domain.model.SmsLoginBody;
import com.dsk.common.helper.LoginHelper;
import com.dsk.system.domain.vo.LoginVo; import com.dsk.system.domain.vo.LoginVo;
import com.dsk.system.domain.vo.RouterVo; import com.dsk.system.domain.vo.RouterVo;
import com.dsk.system.domain.vo.SysTenantVo; import com.dsk.system.domain.vo.SysTenantVo;
...@@ -31,18 +24,19 @@ import com.dsk.system.service.ISysMenuService; ...@@ -31,18 +24,19 @@ import com.dsk.system.service.ISysMenuService;
import com.dsk.system.service.ISysUserService; import com.dsk.system.service.ISysUserService;
import com.dsk.system.service.SysLoginService; import com.dsk.system.service.SysLoginService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.time.Duration; import java.time.Duration;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* 登录验证 * 登录验证
...@@ -78,6 +72,24 @@ public class SysLoginController { ...@@ -78,6 +72,24 @@ public class SysLoginController {
return R.ok(loginVo); return R.ok(loginVo);
} }
/**
* 三方平台跳转登录方法
*
* @param tpLoginBody 登录信息
* @return 结果
*/
@SaIgnore
@PostMapping("/thirdPlatformLogin")
public R<LoginVo> thirdPlatformLogin(@Validated @RequestBody ThirdPlatformLoginBody tpLoginBody, HttpServletRequest request) {
String ipAddr = IpUtil.getIpAddr(request);
LoginVo loginVo = loginService.thirdPlatformLogin(tpLoginBody, ipAddr);
//设置三方登录标识
RedisUtils.setCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + loginVo.getTenantId(), loginVo.getTenantId(), Duration.ofMinutes(5));
return R.ok(loginVo);
}
// /** // /**
// * 发送短信验证码 // * 发送短信验证码
...@@ -245,6 +257,10 @@ public class SysLoginController { ...@@ -245,6 +257,10 @@ public class SysLoginController {
ajax.put("user", user); ajax.put("user", user);
ajax.put("roles", loginUser.getRolePermission()); ajax.put("roles", loginUser.getRolePermission());
ajax.put("permissions", loginUser.getMenuPermission()); ajax.put("permissions", loginUser.getMenuPermission());
String key = GlobalConstants.SOCIAL_AUTH_CODE_KEY + loginUser.getTenantId();
ajax.put("isThirdPlatformLogin", ObjectUtil.isNotNull(RedisUtils.getCacheObject(key)) ? "true" : "false");
//删除三方平台登录标识
RedisUtils.deleteObject(key);
return R.ok(ajax); return R.ok(ajax);
} }
......
package com.dsk.common.core.domain.model;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 三方平台用户登录对象
*
* @author sxk
*/
@Data
public class ThirdPlatformLoginBody {
/**
* 三方平台跳转本系统所需秘钥
*/
@NotBlank(message = "桑芳平台登录秘钥不能为空")
private String thirdPlatformKey;
}
...@@ -36,6 +36,11 @@ public class SysUser extends TenantEntity { ...@@ -36,6 +36,11 @@ public class SysUser extends TenantEntity {
@TableId(value = "user_id") @TableId(value = "user_id")
private Long userId; private Long userId;
/**
* 三方平台跳转本系统所需秘钥
*/
private String thirdPlatformKey;
/** /**
* 部门ID * 部门ID
*/ */
......
...@@ -12,8 +12,6 @@ import cn.hutool.core.util.ObjectUtil; ...@@ -12,8 +12,6 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dsk.common.constant.CacheConstants;
import com.dsk.common.constant.Constants; import com.dsk.common.constant.Constants;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.constant.TenantConstants; import com.dsk.common.constant.TenantConstants;
...@@ -21,6 +19,7 @@ import com.dsk.common.core.domain.dto.RoleDTO; ...@@ -21,6 +19,7 @@ import com.dsk.common.core.domain.dto.RoleDTO;
import com.dsk.common.core.domain.event.LogininforEvent; import com.dsk.common.core.domain.event.LogininforEvent;
import com.dsk.common.core.domain.model.LoginBody; import com.dsk.common.core.domain.model.LoginBody;
import com.dsk.common.core.domain.model.LoginUser; import com.dsk.common.core.domain.model.LoginUser;
import com.dsk.common.core.domain.model.ThirdPlatformLoginBody;
import com.dsk.common.core.domain.model.XcxLoginUser; import com.dsk.common.core.domain.model.XcxLoginUser;
import com.dsk.common.enums.DeviceType; import com.dsk.common.enums.DeviceType;
import com.dsk.common.enums.LoginType; import com.dsk.common.enums.LoginType;
...@@ -31,7 +30,6 @@ import com.dsk.common.exception.user.CaptchaExpireException; ...@@ -31,7 +30,6 @@ import com.dsk.common.exception.user.CaptchaExpireException;
import com.dsk.common.exception.user.UserException; import com.dsk.common.exception.user.UserException;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.tenant.exception.TenantException; import com.dsk.common.tenant.exception.TenantException;
import com.dsk.common.tenant.helper.TenantBroker;
import com.dsk.common.tenant.helper.TenantHelper; import com.dsk.common.tenant.helper.TenantHelper;
import com.dsk.common.utils.DateUtils; import com.dsk.common.utils.DateUtils;
import com.dsk.common.utils.MessageUtils; import com.dsk.common.utils.MessageUtils;
...@@ -39,11 +37,9 @@ import com.dsk.common.utils.ServletUtils; ...@@ -39,11 +37,9 @@ import com.dsk.common.utils.ServletUtils;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils; import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.common.utils.spring.SpringUtils; import com.dsk.common.utils.spring.SpringUtils;
import com.dsk.system.domain.SysTenant;
import com.dsk.system.domain.SysUser; import com.dsk.system.domain.SysUser;
import com.dsk.system.domain.vo.LoginVo; import com.dsk.system.domain.vo.LoginVo;
import com.dsk.system.domain.vo.SysTenantVo; import com.dsk.system.domain.vo.SysTenantVo;
import com.dsk.system.mapper.SysTenantMapper;
import com.dsk.system.mapper.SysUserMapper; import com.dsk.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -161,6 +157,78 @@ public class SysLoginService { ...@@ -161,6 +157,78 @@ public class SysLoginService {
// return StpUtil.getTokenValue(); // return StpUtil.getTokenValue();
} }
/**
* 三方平台跳转登录方法
*
* @param tpLoginBody 登录信息
* @return 结果
*/
public LoginVo thirdPlatformLogin(ThirdPlatformLoginBody tpLoginBody, String ipAddr) {
return TenantHelper.ignore(() -> {
SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getThirdPlatformKey, tpLoginBody.getThirdPlatformKey()));
String tenantId = sysUser.getTenantId();
String username = sysUser.getUserName();
String password = sysUser.getPassword();
if (ReUtil.isMatch(RegexPool.MOBILE, username)) {
String defaultTenantId = RedisUtils.getCacheObject(GlobalConstants.PHONE_DEFAULT_TENANT + username);
log.info("登录用户:{} 获取缓存默认租户:" + tenantId, username);
if (StrUtil.isEmpty(tenantId) && StrUtil.isNotBlank(defaultTenantId)) {
defaultTenantId = checkDefaultTenant(defaultTenantId, username);
tenantId = defaultTenantId;
}
}
//查询手机号绑定的所有用户
if (StrUtil.isEmpty(tenantId)) {
List<SysUser> sysUsers = queryListByPhone(username);
if (CollectionUtil.isEmpty(sysUsers)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
} else if (sysUsers.size() > 1) {
//处理存在多个用户的情况,取一个最新租户
SysUser sysUser1 = sysUsers.get(0);
if (ObjectUtil.isEmpty(sysUser)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
}
tenantId = sysUser1.getTenantId();
} else {
SysUser sysUser2 = sysUsers.get(0);
tenantId = sysUser2.getTenantId();
}
}
// 校验租户
if (tenantId != null) {
checkTenant(tenantId);
}
if (tenantId == null || "".equals(tenantId)) {
tenantId = TenantConstants.DEFAULT_TENANT_ID;
}
TenantHelper.setTenantId(tenantId);
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
SysUser user = loadUserByUsername(username);
//checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, user.getPassword()));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser loginUser = buildLoginUser(user);
// 生成token
loginUser.setIpaddr(ipAddr);
LoginHelper.loginByDevice(loginUser, DeviceType.PC);
recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
recordLoginInfo(user.getUserId(), username);
LoginVo loginVo = new LoginVo();
loginVo.setTenantId(TenantHelper.getTenantId());
loginVo.setAccessToken(StpUtil.getTokenValue());
loginVo.setExpireIn(StpUtil.getTokenTimeout());
return loginVo;
});
}
/** /**
* 登录验证 * 登录验证
......
...@@ -23,6 +23,7 @@ import com.dsk.common.core.domain.entity.SysDictType; ...@@ -23,6 +23,7 @@ import com.dsk.common.core.domain.entity.SysDictType;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.enums.UserStatus; import com.dsk.common.enums.UserStatus;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.common.utils.DingTalkUtil;
import com.dsk.common.utils.PasswordUtils; import com.dsk.common.utils.PasswordUtils;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils; import com.dsk.common.utils.redis.RedisUtils;
...@@ -175,6 +176,7 @@ public class ISysTenantServiceImpl implements ISysTenantService { ...@@ -175,6 +176,7 @@ public class ISysTenantServiceImpl implements ISysTenantService {
new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), Convert::toStr); new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), Convert::toStr);
String tenantId = generateTenantId(tenantIds); String tenantId = generateTenantId(tenantIds);
add.setTenantId(tenantId); add.setTenantId(tenantId);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (!flag) { if (!flag) {
throw new ServiceException("创建租户失败"); throw new ServiceException("创建租户失败");
...@@ -204,6 +206,8 @@ public class ISysTenantServiceImpl implements ISysTenantService { ...@@ -204,6 +206,8 @@ public class ISysTenantServiceImpl implements ISysTenantService {
// 创建系统用户 // 创建系统用户
SysUser user = new SysUser(); SysUser user = new SysUser();
user.setTenantId(tenantId); user.setTenantId(tenantId);
String thirdPlatformKey = UUID.randomUUID().toString();
user.setThirdPlatformKey(thirdPlatformKey);
user.setPhonenumber(bo.getContactPhone()); user.setPhonenumber(bo.getContactPhone());
//默认新增用户名为手机号 //默认新增用户名为手机号
user.setUserName(bo.getContactPhone()); user.setUserName(bo.getContactPhone());
...@@ -252,13 +256,15 @@ public class ISysTenantServiceImpl implements ISysTenantService { ...@@ -252,13 +256,15 @@ public class ISysTenantServiceImpl implements ISysTenantService {
} }
configMapper.insertBatch(sysConfigList); configMapper.insertBatch(sysConfigList);
////此处暂用钉钉机器人模拟发送短信 //此处暂用钉钉机器人模拟发送短信
//String content = "【短信通知】:" String content = "【短信通知】:"
// + bo.getContactUserName() + bo.getContactUserName()
// + ",您好,您已经成功开通数字化经营管理系统,请使用手机号码登录,初始密码为" + ",您好,您已经成功开通数字化经营管理系统,请使用手机号码登录,初始密码为"
// + password + password
// + "。友情提示:为了您的账号安全,请勿泄露密码。"; + ",三方平台登录秘钥为"
//DingTalkUtil.sendDingTalkMsg(content); + thirdPlatformKey
+ "。友情提示:为了您的账号安全,请勿泄露密码。";
DingTalkUtil.sendDingTalkMsg(content);
//租户新增成功,发送短信通知租户 //租户新增成功,发送短信通知租户
LinkedHashMap<String, String> map = new LinkedHashMap<>(1); LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment