thiszhc
2023-06-10 e4b405491fa2ba0ede349b8f92b5b86172e2da3a
ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -6,9 +6,15 @@
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.servlet.http.HttpServletRequest;
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;
@@ -26,18 +32,17 @@
import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
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.ISysPermissionService;
import org.dromara.system.service.ISysTenantService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@@ -82,9 +87,10 @@
        // 校验租户
        checkTenant(tenantId);
        // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
        SysUserVo user = loadUserByUsername(tenantId, username);
        checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
        // 此处可根据登录用户的数据不同 自行创建 loginUser
        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
        LoginUser loginUser = buildLoginUser(user);
        // 生成token
        LoginHelper.loginByDevice(loginUser, DeviceType.PC);
@@ -101,7 +107,7 @@
        SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber);
        checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
        // 此处可根据登录用户的数据不同 自行创建 loginUser
        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
        LoginUser loginUser = buildLoginUser(user);
        // 生成token
        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
@@ -114,11 +120,11 @@
    public String emailLogin(String tenantId, String email, String emailCode) {
        // 校验租户
        checkTenant(tenantId);
        // 通过手机号查找用户
        // 通过邮箱查找用户
        SysUserVo user = loadUserByEmail(tenantId, email);
        checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
        // 此处可根据登录用户的数据不同 自行创建 loginUser
        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
        LoginUser loginUser = buildLoginUser(user);
        // 生成token
        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
@@ -134,11 +140,12 @@
        // todo 以下自行实现
        // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid
        String openid = "";
        // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
        SysUserVo user = loadUserByOpenid(openid);
        // 校验租户
        checkTenant(user.getTenantId());
        // 此处可根据登录用户的数据不同 自行创建 loginUser
        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
        XcxLoginUser loginUser = new XcxLoginUser();
        loginUser.setTenantId(user.getTenantId());
        loginUser.setUserId(user.getUserId());
@@ -153,6 +160,65 @@
        return StpUtil.getTokenValue();
    }
    /**
     * 认证授权登录
     * @param source
     * @throws IOException
     */
    /**
     * 社交登录
     * @param source   登录来源
     * @param authUser   授权响应实体
     * @param request   Http请求对象
     * @return   统一响应实体
     * @throws IOException
     */
    public R<String> socialLogin(String source, AuthResponse<AuthUser> authUser, HttpServletRequest request) throws IOException {
        // 判断授权响应是否成功
        if (!authUser.ok()) {
            return R.fail("对不起,授权信息验证不通过,请联系管理员");
        }
        AuthUser authUserData = authUser.getData();
        // 判断数据库中是否已存在该用户
        SysUserVo user = userMapper.selectAuthUserByUuid(source + authUserData.getUuid());
        if (ObjectUtil.isNotNull(user)) {
            checkTenant(user.getTenantId());
            SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
            // 登录
            LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.auth);
            recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
            recordLoginInfo(user.getUserId());
            return R.ok(StpUtil.getTokenValue());
        } else {
            if (LoginHelper.getUserId() == null) {
                return R.fail("授权失败,请先登录再绑定");
            }
            // 组装授权用户信息
            SysAuthUser sysAuthUser = new SysAuthUser();
            sysAuthUser.setAvatar(authUserData.getAvatar());
            sysAuthUser.setUuid(source + authUserData.getUuid());
            sysAuthUser.setUserId(LoginHelper.getUserId());
            sysAuthUser.setUserName(authUserData.getUsername());
            sysAuthUser.setNickName(authUserData.getNickname());
            sysAuthUser.setEmail(authUserData.getEmail());
            sysAuthUser.setSource(source);
            sysAuthUser.setCreateTime(new Date().toString());
            // 新用户,绑定第三方账号
            userMapper.insertAuthUser(sysAuthUser);
            SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
            checkTenant(lodingData.getTenantId());
            LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.auth);
            recordLogininfor(lodingData.getTenantId(), sysAuthUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
            recordLoginInfo(sysAuthUser.getUserId());
            return R.ok(StpUtil.getTokenValue());
        }
    }
    /**
     * 退出登录
     */