疯狂的狮子Li
2023-06-20 9448782f451790beb05b2e6717683dc0a59d6a24
ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -8,9 +8,12 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -29,11 +32,15 @@
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysSocialBo;
import org.dromara.system.domain.vo.SysSocialVo;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysSocialService;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysTenantService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -53,6 +60,7 @@
public class SysLoginService {
    private final SysUserMapper userMapper;
    private final ISysSocialService sysSocialService;
    private final CaptchaProperties captchaProperties;
    private final ISysPermissionService permissionService;
    private final ISysTenantService tenantService;
@@ -155,6 +163,62 @@
    }
    /**
     * 社交登录
     *
     * @param source   登录来源
     * @param authUser 授权响应实体
     * @return 统一响应实体
     */
    public R<String> socialLogin(String source, AuthResponse<AuthUser> authUser) {
        // 判断授权响应是否成功
        if (!authUser.ok()) {
            return R.fail("对不起,授权信息验证不通过,请退出重试!");
        }
        AuthUser authUserData = authUser.getData();
        SysSocialVo user = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
        if (ObjectUtil.isNotNull(user)) {
            // 执行登录和记录登录信息操作
            return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData);
        } else {
            // 判断是否已登录
            if (LoginHelper.getUserId() == null) {
                return R.fail("授权失败,请先登录才能绑定");
            }
            SysSocialBo bo = new SysSocialBo();
            bo.setUserId(LoginHelper.getUserId());
            bo.setAuthId(authUserData.getSource() + authUserData.getUuid());
            bo.setSource(authUserData.getSource());
            bo.setUserName(authUserData.getUsername());
            bo.setNickName(authUserData.getNickname());
            bo.setAvatar(authUserData.getAvatar());
            bo.setOpenId(authUserData.getUuid());
            BeanUtils.copyProperties(authUserData.getToken(), bo);
            sysSocialService.insertByBo(bo);
            SysUserVo sysUser = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
            // 执行登录和记录登录信息操作
            return loginAndRecord(sysUser.getTenantId(), sysUser.getUserName(), authUserData);
        }
    }
    /**
     * 执行登录和记录登录信息操作
     *
     * @param tenantId 租户ID
     * @param userName 用户名
     * @param authUser 授权用户信息
     * @return 统一响应实体
     */
    private R<String> loginAndRecord(String tenantId, String userName, AuthUser authUser) {
        checkTenant(tenantId);
        SysUserVo dbUser = loadUserByUsername(tenantId, userName);
        LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
        recordLogininfor(dbUser.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
        recordLoginInfo(dbUser.getUserId());
        return R.ok(StpUtil.getTokenValue());
    }
    /**
     * 退出登录
     */
    public void logout() {
@@ -235,9 +299,9 @@
    private SysUserVo loadUserByUsername(String tenantId, String username) {
        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
                .select(SysUser::getUserName, SysUser::getStatus)
                .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
                .eq(SysUser::getUserName, username));
            .select(SysUser::getUserName, SysUser::getStatus)
            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
            .eq(SysUser::getUserName, username));
        if (ObjectUtil.isNull(user)) {
            log.info("登录用户:{} 不存在.", username);
            throw new UserException("user.not.exists", username);
@@ -253,9 +317,9 @@
    private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
                .select(SysUser::getPhonenumber, SysUser::getStatus)
                .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
                .eq(SysUser::getPhonenumber, phonenumber));
            .select(SysUser::getPhonenumber, SysUser::getStatus)
            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
            .eq(SysUser::getPhonenumber, phonenumber));
        if (ObjectUtil.isNull(user)) {
            log.info("登录用户:{} 不存在.", phonenumber);
            throw new UserException("user.not.exists", phonenumber);
@@ -271,7 +335,7 @@
    private SysUserVo loadUserByEmail(String tenantId, String email) {
        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
            .select(SysUser::getPhonenumber, SysUser::getStatus)
            .select(SysUser::getEmail, SysUser::getStatus)
            .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
            .eq(SysUser::getEmail, email));
        if (ObjectUtil.isNull(user)) {
@@ -382,7 +446,7 @@
            log.info("登录租户:{} 已被停用.", tenantId);
            throw new TenantException("tenant.blocked");
        } else if (ObjectUtil.isNotNull(tenant.getExpireTime())
                && new Date().after(tenant.getExpireTime())) {
            && new Date().after(tenant.getExpireTime())) {
            log.info("登录租户:{} 已超过有效期.", tenantId);
            throw new TenantException("tenant.expired");
        }