|
|
@@ -0,0 +1,140 @@
|
|
|
+package com.storlead.account.system.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.storlead.account.system.dto.SystemLoginDTO;
|
|
|
+import com.storlead.account.system.dto.TenantLoginDTO;
|
|
|
+import com.storlead.account.system.entity.SystemUserEntity;
|
|
|
+import com.storlead.account.system.service.AuthLoginService;
|
|
|
+import com.storlead.account.system.service.SystemUserEntityService;
|
|
|
+import com.storlead.account.tenant.entity.TenantEnterpriseUserRelEntity;
|
|
|
+import com.storlead.account.tenant.service.TenantEnterpriseUserRelEntityService;
|
|
|
+import com.storlead.framework.auth.vo.LoginUser;
|
|
|
+import com.storlead.framework.common.ecode.BCryptPasswordEncoder;
|
|
|
+import com.storlead.framework.redis.RedisService;
|
|
|
+import com.storlead.framework.web.assemble.Result;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.UUID;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class AuthLoginServiceImpl implements AuthLoginService {
|
|
|
+
|
|
|
+ private static final long TOKEN_EXPIRE_SECONDS = 7L * 24L * 60L * 60L;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private SystemUserEntityService systemUserService;
|
|
|
+ @Resource
|
|
|
+ private TenantEnterpriseUserRelEntityService tenantUserRelService;
|
|
|
+ @Resource
|
|
|
+ private BCryptPasswordEncoder passwordEncoder;
|
|
|
+ @Resource
|
|
|
+ private RedisService redisService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Result<Object> systemLogin(SystemLoginDTO dto, String ip) {
|
|
|
+ if (StringUtils.isBlank(dto.getUsername()) || StringUtils.isBlank(dto.getPassword())) {
|
|
|
+ return Result.error("用户名或密码不能为空");
|
|
|
+ }
|
|
|
+ SystemUserEntity user = getEnabledSystemUser(dto.getUsername());
|
|
|
+ if (user == null || !passwordEncoder.matches(dto.getPassword(), user.getPasswordHash())) {
|
|
|
+ return Result.error("用户名或密码错误");
|
|
|
+ }
|
|
|
+ LoginUser loginUser = toLoginUser(user, true, null);
|
|
|
+ String token = issueToken(loginUser);
|
|
|
+ updateLastLogin(user, ip);
|
|
|
+ return loginResult(token, loginUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Result<Object> tenantLogin(TenantLoginDTO dto, String ip) {
|
|
|
+ if (StringUtils.isBlank(dto.getUsername()) || StringUtils.isBlank(dto.getPassword())) {
|
|
|
+ return Result.error("用户名或密码不能为空");
|
|
|
+ }
|
|
|
+ SystemUserEntity user = getEnabledSystemUser(dto.getUsername());
|
|
|
+ if (user == null || !passwordEncoder.matches(dto.getPassword(), user.getPasswordHash())) {
|
|
|
+ return Result.error("用户名或密码错误");
|
|
|
+ }
|
|
|
+
|
|
|
+ LambdaQueryWrapper<TenantEnterpriseUserRelEntity> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ wrapper.eq(TenantEnterpriseUserRelEntity::getUserId, user.getId())
|
|
|
+ .eq(TenantEnterpriseUserRelEntity::getIsDelete, 0)
|
|
|
+ .eq(TenantEnterpriseUserRelEntity::getEnabled, true);
|
|
|
+ if (dto.getTenantId() != null) {
|
|
|
+ wrapper.eq(TenantEnterpriseUserRelEntity::getTenantId, dto.getTenantId());
|
|
|
+ }
|
|
|
+ List<TenantEnterpriseUserRelEntity> relList = tenantUserRelService.list(wrapper);
|
|
|
+ if (relList == null || relList.isEmpty()) {
|
|
|
+ return Result.error("当前账号未绑定可登录租户");
|
|
|
+ }
|
|
|
+ if (dto.getTenantId() == null && relList.size() > 1) {
|
|
|
+ return Result.error("账号绑定多个租户,请传tenantId");
|
|
|
+ }
|
|
|
+
|
|
|
+ TenantEnterpriseUserRelEntity rel = relList.get(0);
|
|
|
+ LoginUser loginUser = toLoginUser(user, false, rel.getTenantId());
|
|
|
+ String token = issueToken(loginUser);
|
|
|
+ updateLastLogin(user, ip);
|
|
|
+ return loginResult(token, loginUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Result<Object> logout(String token) {
|
|
|
+ if (StringUtils.isBlank(token)) {
|
|
|
+ return Result.error("token不能为空");
|
|
|
+ }
|
|
|
+ redisService.deleteObject(token);
|
|
|
+ return Result.ok(true);
|
|
|
+ }
|
|
|
+
|
|
|
+ private SystemUserEntity getEnabledSystemUser(String username) {
|
|
|
+ return systemUserService.getOne(new LambdaQueryWrapper<SystemUserEntity>()
|
|
|
+ .eq(SystemUserEntity::getUsername, username)
|
|
|
+ .eq(SystemUserEntity::getIsDelete, 0)
|
|
|
+ .eq(SystemUserEntity::getEnabled, true)
|
|
|
+ .last("limit 1"));
|
|
|
+ }
|
|
|
+
|
|
|
+ private LoginUser toLoginUser(SystemUserEntity user, boolean isAdmin, Long tenantId) {
|
|
|
+ LoginUser loginUser = new LoginUser();
|
|
|
+ loginUser.setId(user.getId());
|
|
|
+ loginUser.setUserName(user.getUsername());
|
|
|
+ loginUser.setNickName(user.getNickName());
|
|
|
+ loginUser.setAvatar(user.getAvatar());
|
|
|
+ loginUser.setEmail(user.getEmail());
|
|
|
+ loginUser.setMobile(user.getMobile());
|
|
|
+ loginUser.setEnabled(Boolean.TRUE.equals(user.getEnabled()) ? 1 : 0);
|
|
|
+ loginUser.setIsAdmin(isAdmin);
|
|
|
+ loginUser.setTenantId(tenantId);
|
|
|
+ loginUser.setCompanyId(tenantId);
|
|
|
+ return loginUser;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String issueToken(LoginUser loginUser) {
|
|
|
+ String token = UUID.randomUUID().toString().replace("-", "");
|
|
|
+ redisService.setCacheObject(token, JSONUtil.toJsonStr(loginUser), TOKEN_EXPIRE_SECONDS, TimeUnit.SECONDS);
|
|
|
+ return token;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Result<Object> loginResult(String token, LoginUser loginUser) {
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
+ data.put("token", token);
|
|
|
+ data.put("user", loginUser);
|
|
|
+ return Result.ok(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateLastLogin(SystemUserEntity user, String ip) {
|
|
|
+ SystemUserEntity update = new SystemUserEntity();
|
|
|
+ update.setId(user.getId());
|
|
|
+ update.setLastLoginAt(new Date());
|
|
|
+ update.setLastLoginIp(ip);
|
|
|
+ systemUserService.updateById(update);
|
|
|
+ }
|
|
|
+}
|