package com.tcm.training.admin.auth.service;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.tcm.training.admin.auth.dto.LoginRequest;
|
import com.tcm.training.admin.auth.vo.LoginResponse;
|
import com.tcm.training.admin.auth.vo.UserVO;
|
import com.tcm.training.admin.user.entity.SysUser;
|
import com.tcm.training.admin.user.service.RbacService;
|
import com.tcm.training.admin.user.service.SysUserService;
|
import cn.dev33.satoken.stp.SaTokenInfo;
|
import cn.dev33.satoken.stp.StpUtil;
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
import org.springframework.stereotype.Service;
|
|
import java.time.LocalDateTime;
|
import java.util.List;
|
|
@Service
|
public class AuthService {
|
|
private final SysUserService sysUserService;
|
private final BCryptPasswordEncoder passwordEncoder;
|
private final CaptchaService captchaService;
|
private final RbacService rbacService;
|
|
public AuthService(
|
SysUserService sysUserService,
|
BCryptPasswordEncoder passwordEncoder,
|
CaptchaService captchaService,
|
RbacService rbacService
|
) {
|
this.sysUserService = sysUserService;
|
this.passwordEncoder = passwordEncoder;
|
this.captchaService = captchaService;
|
this.rbacService = rbacService;
|
}
|
|
public LoginResponse login(LoginRequest req) {
|
captchaService.validate(req.getCaptchaId(), req.getCaptchaCode());
|
|
SysUser user = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
|
.eq(SysUser::getUsername, req.getUsername())
|
.eq(SysUser::getDeleted, 0)
|
.last("limit 1"));
|
if (user == null) {
|
throw new IllegalArgumentException("账号或密码错误");
|
}
|
if (user.getStatus() != null && user.getStatus() != 1) {
|
throw new IllegalArgumentException("账号已被禁用");
|
}
|
if (!passwordEncoder.matches(req.getPassword(), user.getPassword())) {
|
throw new IllegalArgumentException("账号或密码错误");
|
}
|
|
StpUtil.login(user.getId());
|
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
|
user.setLastLoginAt(LocalDateTime.now());
|
sysUserService.updateById(user);
|
|
UserVO userVO = buildUserVO(user);
|
return new LoginResponse(tokenInfo.getTokenValue(), "Bearer", tokenInfo.getTokenTimeout(), userVO);
|
}
|
|
public void logout() {
|
StpUtil.logout();
|
}
|
|
public UserVO me() {
|
Long userId = StpUtil.getLoginIdAsLong();
|
SysUser user = sysUserService.getById(userId);
|
if (user == null || (user.getDeleted() != null && user.getDeleted() == 1)) {
|
throw new IllegalArgumentException("用户不存在");
|
}
|
return buildUserVO(user);
|
}
|
|
private UserVO buildUserVO(SysUser user) {
|
List<String> roleCodes = rbacService.getRoleCodesByUserId(user.getId());
|
List<String> permissionKeys = rbacService.getPermissionKeysByUserId(user.getId());
|
return new UserVO(
|
user.getId(),
|
user.getUsername(),
|
user.getNickname(),
|
user.getRealName(),
|
user.getPhone(),
|
roleCodes,
|
permissionKeys
|
);
|
}
|
}
|