|
@@ -0,0 +1,114 @@
|
|
|
|
+package com.koobietech.eas.service.impl;
|
|
|
|
+
|
|
|
|
+import com.koobietech.eas.common.constant.UserType;
|
|
|
|
+import com.koobietech.eas.common.exception.EasException;
|
|
|
|
+import com.koobietech.eas.common.pojo.JwtUserDto;
|
|
|
|
+import com.koobietech.eas.common.utils.JwtManager;
|
|
|
|
+import com.koobietech.eas.common.utils.PasswordManager;
|
|
|
|
+import com.koobietech.eas.dao.Pojo.AdminPojo;
|
|
|
|
+import com.koobietech.eas.dao.adminLoginPojo.UserDetail;
|
|
|
|
+import com.koobietech.eas.dao.dto.LoginToken;
|
|
|
|
+import com.koobietech.eas.dao.mapper.AdminLoginMapper;
|
|
|
|
+import com.koobietech.eas.mbg.mapper.EasSysUserinfoMapper;
|
|
|
|
+import com.koobietech.eas.mbg.model.EasSysUserinfo;
|
|
|
|
+import com.koobietech.eas.mbg.model.EasSysUserinfoExample;
|
|
|
|
+import com.koobietech.eas.service.AdminLoginService;
|
|
|
|
+import com.koobietech.eas.service.LoginRedisService;
|
|
|
|
+import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Optional;
|
|
|
|
+
|
|
|
|
+@Service
|
|
|
|
+public class AdminLoginServiceImpl implements AdminLoginService {
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private PasswordEncoder passwordEncoder;
|
|
|
|
+ @Resource
|
|
|
|
+ private PasswordManager passwordManager;
|
|
|
|
+ @Resource
|
|
|
|
+ private AdminLoginMapper adminLoginMapper;
|
|
|
|
+ @Resource
|
|
|
|
+ private EasSysUserinfoMapper easSysUserinfoMapper;
|
|
|
|
+ @Resource
|
|
|
|
+ private LoginRedisService loginRedisService;
|
|
|
|
+ @Resource
|
|
|
|
+ private JwtManager jwtManager;
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public LoginToken adminLogin(AdminPojo adminPojo) {
|
|
|
|
+ if (adminPojo.getUsername() == null || adminPojo.getPasswd() == null || adminPojo.getUsername().isEmpty() || adminPojo.getPasswd().isEmpty()) {
|
|
|
|
+ throw new EasException("用户不存在", 509);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ EasSysUserinfo easSysUserinfo = findAdminByUsername(adminPojo.getUsername(), adminPojo.getPasswd());
|
|
|
|
+
|
|
|
|
+ // 接收到对象,根据这个信息去查询数据库,然后自定义sql查用户信息,存在redis里面当做token
|
|
|
|
+ System.out.println(easSysUserinfo);
|
|
|
|
+ //先获取id,进行枚举判断
|
|
|
|
+ Long id = easSysUserinfo.getId();
|
|
|
|
+ //先调用自定义sql查询detail类中的数据 最后把这个类封装到redis里面
|
|
|
|
+ UserDetail userDetailInRedis = adminLoginMapper.getUserDetailById(id);
|
|
|
|
+ System.out.println("接收前" + userDetailInRedis);
|
|
|
|
+ userDetailInRedis.setDepartments(adminLoginMapper.getUserDepartmentsById(id));
|
|
|
|
+ userDetailInRedis.setPermissions(adminLoginMapper.getUserPermissionsById(id));
|
|
|
|
+ System.out.println("接收后" + userDetailInRedis);
|
|
|
|
+
|
|
|
|
+ // 先调用自定义sql查询用户详细信息、部门信息和权限信息
|
|
|
|
+ UserType userType = UserType.TEACHER;
|
|
|
|
+ if (userDetailInRedis.getUsername().equals("admin")) {
|
|
|
|
+ userType = UserType.ADMIN;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // token过期时间
|
|
|
|
+ Integer token_expires = 30;
|
|
|
|
+ Integer refreshToken_expires = 60;
|
|
|
|
+
|
|
|
|
+ // 生成token
|
|
|
|
+ JwtUserDto jwtUserDto = new JwtUserDto(userDetailInRedis.getUsername(), userDetailInRedis.getId(), userType);
|
|
|
|
+ String token = jwtManager.createJwt(jwtUserDto, token_expires);
|
|
|
|
+ String refreshToken = jwtManager.createJwt(jwtUserDto, refreshToken_expires);
|
|
|
|
+
|
|
|
|
+ // 生成redis key
|
|
|
|
+ String redisTokenKey = loginRedisService.createJwtTokenKey(jwtUserDto);
|
|
|
|
+ String redisRefreshTokenKey = loginRedisService.createJwtRefreshTokenKey(jwtUserDto);
|
|
|
|
+
|
|
|
|
+ // 将token存入redis
|
|
|
|
+ loginRedisService.loginSaveCache(redisTokenKey, userDetailInRedis, token_expires);
|
|
|
|
+ loginRedisService.loginSaveCache(redisRefreshTokenKey, userDetailInRedis, refreshToken_expires);
|
|
|
|
+
|
|
|
|
+ // 登录成功
|
|
|
|
+ return new LoginToken(token, refreshToken);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private EasSysUserinfo findAdminByUsername(String username, String password) {
|
|
|
|
+ EasSysUserinfoExample easSysUserinfoExample = new EasSysUserinfoExample();
|
|
|
|
+ easSysUserinfoExample.createCriteria().andUsernameEqualTo(username);
|
|
|
|
+ List<EasSysUserinfo> adminList = easSysUserinfoMapper.selectByExample(easSysUserinfoExample);
|
|
|
|
+
|
|
|
|
+ // 使用Optional简化判断
|
|
|
|
+ Optional<EasSysUserinfo> optionalAdmin = adminList.stream().findFirst();
|
|
|
|
+
|
|
|
|
+ if (optionalAdmin.isEmpty()) {
|
|
|
|
+ throw new EasException("用户不存在", 9902);
|
|
|
|
+ }
|
|
|
|
+ if (adminList.size() > 1) {
|
|
|
|
+ throw new EasException("用户数据异常", 9902);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ EasSysUserinfo easSysUserinfo = optionalAdmin.get();
|
|
|
|
+ validatePassword(password, easSysUserinfo.getPasswd());
|
|
|
|
+
|
|
|
|
+ return easSysUserinfo;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void validatePassword(String inputPassword, String encryptedPassword){
|
|
|
|
+ String decryptedPassword = passwordManager.decryptPassword(inputPassword);
|
|
|
|
+ System.out.println("前端解密来的decryptedPassword: " + decryptedPassword);
|
|
|
|
+ System.out.println("数据库查到的密码easSysUserinfo.getPasswd(): " + encryptedPassword);
|
|
|
|
+ if (!passwordEncoder.matches(decryptedPassword, encryptedPassword)) {
|
|
|
|
+ throw new EasException("密码不正确", 9901);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|