From 193957946435874a47baea3d39f3d1b785a21837 Mon Sep 17 00:00:00 2001 From: zhouhaibin Date: Wed, 26 Feb 2025 09:20:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=99=BB=E5=BD=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 57 ++++++++++++++++++- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index c24d966..8e453a5 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -2,9 +2,14 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; 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; @@ -14,9 +19,10 @@ import me.zhyd.oauth.request.AuthRequest; import me.zhyd.oauth.utils.AuthStateUtils; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.model.LoginBody; -import org.dromara.common.core.domain.model.RegisterBody; -import org.dromara.common.core.domain.model.SocialLoginBody; +import org.dromara.common.core.domain.model.*; +import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.*; import org.dromara.common.encrypt.annotation.ApiEncrypt; import org.dromara.common.json.utils.JsonUtils; @@ -27,9 +33,12 @@ import org.dromara.common.social.utils.SocialUtils; import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysClientVo; 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.ISysClientService; import org.dromara.system.service.ISysConfigService; import org.dromara.system.service.ISysSocialService; @@ -71,6 +80,7 @@ public class AuthController { private final ISysSocialService socialUserService; private final ISysClientService clientService; private final ScheduledExecutorService scheduledExecutorService; + private final SysUserMapper userMapper; /** @@ -230,5 +240,46 @@ public class AuthController { result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); return R.ok(result); } + @SaIgnore + @PostMapping("/doLogin") + public R doLogin(@RequestBody HashMap params) { + String body=params.get("body"); + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + SysUserVo user = loadUserByUsername(username); + loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword())); + // 此处可根据登录用户的数据不同 自行创建 loginUser + return loginService.buildLoginUser(user); + }); + loginUser.setDeviceType("pc"); + + SaLoginModel model = new SaLoginModel(); + model.setDevice("pc"); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(120); + model.setActiveTimeout(120); + model.setExtra(LoginHelper.CLIENT_KEY, loginBody.getClientId()); + + // 生成token + LoginHelper.login(loginUser, model); + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + return R.ok(loginVo); + } + private SysUserVo loadUserByUsername(String username) { + SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); + if (ObjectUtil.isNull(user)) { + throw new UserException("user.not.exists", username); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + throw new UserException("user.blocked", username); + } + return user; + } }