|
@ -2,9 +2,14 @@ package org.dromara.web.controller; |
|
|
|
|
|
|
|
|
import cn.dev33.satoken.annotation.SaIgnore; |
|
|
import cn.dev33.satoken.annotation.SaIgnore; |
|
|
import cn.dev33.satoken.exception.NotLoginException; |
|
|
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.codec.Base64; |
|
|
import cn.hutool.core.collection.CollUtil; |
|
|
import cn.hutool.core.collection.CollUtil; |
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
import jakarta.servlet.http.HttpServletRequest; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
@ -14,9 +19,10 @@ import me.zhyd.oauth.request.AuthRequest; |
|
|
import me.zhyd.oauth.utils.AuthStateUtils; |
|
|
import me.zhyd.oauth.utils.AuthStateUtils; |
|
|
import org.dromara.common.core.constant.UserConstants; |
|
|
import org.dromara.common.core.constant.UserConstants; |
|
|
import org.dromara.common.core.domain.R; |
|
|
import org.dromara.common.core.domain.R; |
|
|
import org.dromara.common.core.domain.model.LoginBody; |
|
|
import org.dromara.common.core.domain.model.*; |
|
|
import org.dromara.common.core.domain.model.RegisterBody; |
|
|
import org.dromara.common.core.enums.LoginType; |
|
|
import org.dromara.common.core.domain.model.SocialLoginBody; |
|
|
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.core.utils.*; |
|
|
import org.dromara.common.encrypt.annotation.ApiEncrypt; |
|
|
import org.dromara.common.encrypt.annotation.ApiEncrypt; |
|
|
import org.dromara.common.json.utils.JsonUtils; |
|
|
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.dto.SseMessageDto; |
|
|
import org.dromara.common.sse.utils.SseMessageUtils; |
|
|
import org.dromara.common.sse.utils.SseMessageUtils; |
|
|
import org.dromara.common.tenant.helper.TenantHelper; |
|
|
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.bo.SysTenantBo; |
|
|
import org.dromara.system.domain.vo.SysClientVo; |
|
|
import org.dromara.system.domain.vo.SysClientVo; |
|
|
import org.dromara.system.domain.vo.SysTenantVo; |
|
|
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.ISysClientService; |
|
|
import org.dromara.system.service.ISysConfigService; |
|
|
import org.dromara.system.service.ISysConfigService; |
|
|
import org.dromara.system.service.ISysSocialService; |
|
|
import org.dromara.system.service.ISysSocialService; |
|
@ -71,6 +80,7 @@ public class AuthController { |
|
|
private final ISysSocialService socialUserService; |
|
|
private final ISysSocialService socialUserService; |
|
|
private final ISysClientService clientService; |
|
|
private final ISysClientService clientService; |
|
|
private final ScheduledExecutorService scheduledExecutorService; |
|
|
private final ScheduledExecutorService scheduledExecutorService; |
|
|
|
|
|
private final SysUserMapper userMapper; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -230,5 +240,46 @@ public class AuthController { |
|
|
result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); |
|
|
result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); |
|
|
return R.ok(result); |
|
|
return R.ok(result); |
|
|
} |
|
|
} |
|
|
|
|
|
@SaIgnore |
|
|
|
|
|
@PostMapping("/doLogin") |
|
|
|
|
|
public R<LoginVo> doLogin(@RequestBody HashMap<String, String> 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<SysUser>().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; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|