| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | // 校验租户 |
| | | 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); |
| | |
| | | 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); |
| | |
| | | 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); |
| | |
| | | // 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()); |
| | |
| | | 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()); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 退出登录 |
| | | */ |