|
@@ -16,6 +16,7 @@ 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;
|
|
@@ -36,10 +37,14 @@ public class AdminLoginServiceImpl implements AdminLoginService {
|
|
|
@Resource
|
|
|
private JwtManager jwtManager;
|
|
|
|
|
|
+ // token过期时间 单位:s
|
|
|
+ private final Integer token_expires = 30;
|
|
|
+ private final Integer refreshToken_expires = 60;
|
|
|
+
|
|
|
@Override
|
|
|
public LoginToken adminLogin(AdminPojo adminPojo) {
|
|
|
if (adminPojo.getUsername() == null || adminPojo.getPasswd() == null || adminPojo.getUsername().isEmpty() || adminPojo.getPasswd().isEmpty()) {
|
|
|
- throw new EasException("用户不存在", 509);
|
|
|
+ throw new EasException("用户不存在", 412);
|
|
|
}
|
|
|
|
|
|
EasSysUserinfo easSysUserinfo = findAdminByUsername(adminPojo.getUsername(), adminPojo.getPasswd());
|
|
@@ -55,33 +60,58 @@ public class AdminLoginServiceImpl implements AdminLoginService {
|
|
|
userDetailInRedis.setPermissions(adminLoginMapper.getUserPermissionsById(id));
|
|
|
System.out.println("接收后" + userDetailInRedis);
|
|
|
|
|
|
- // 先调用自定义sql查询用户详细信息、部门信息和权限信息
|
|
|
- UserType userType = UserType.TEACHER;
|
|
|
- if (userDetailInRedis.getUsername().equals("admin")) {
|
|
|
- userType = UserType.ADMIN;
|
|
|
- }
|
|
|
+ // 先调用自定义sql查询用户详细信息、部门信息 和 权限信息
|
|
|
+ UserType userType = UserType.TEACHER;
|
|
|
+ if (userDetailInRedis.getUsername().equals("admin")) {
|
|
|
+ userType = UserType.ADMIN;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成token
|
|
|
+ JwtUserDto jwtUserDto = new JwtUserDto(userDetailInRedis.getUsername(), userDetailInRedis.getId(), userType);
|
|
|
+ String token = jwtManager.createJwt(jwtUserDto, token_expires);
|
|
|
+ String refreshToken = jwtManager.createJwt(jwtUserDto, refreshToken_expires);
|
|
|
|
|
|
- // token过期时间
|
|
|
- Integer token_expires = 30;
|
|
|
- Integer refreshToken_expires = 60;
|
|
|
+ // 生成redis key
|
|
|
+ String redisTokenKey = loginRedisService.createJwtTokenKey(jwtUserDto);
|
|
|
+ String redisRefreshTokenKey = loginRedisService.createJwtRefreshTokenKey(jwtUserDto);
|
|
|
|
|
|
- // 生成token
|
|
|
- JwtUserDto jwtUserDto = new JwtUserDto(userDetailInRedis.getUsername(), userDetailInRedis.getId(), userType);
|
|
|
- String token = jwtManager.createJwt(jwtUserDto, token_expires);
|
|
|
- String refreshToken = jwtManager.createJwt(jwtUserDto, refreshToken_expires);
|
|
|
+ // 将token存入redis
|
|
|
+ loginRedisService.loginSaveCache(redisTokenKey, userDetailInRedis, token_expires);
|
|
|
+ loginRedisService.loginSaveCache(redisRefreshTokenKey, userDetailInRedis, refreshToken_expires);
|
|
|
|
|
|
- // 生成redis key
|
|
|
- String redisTokenKey = loginRedisService.createJwtTokenKey(jwtUserDto);
|
|
|
- String redisRefreshTokenKey = loginRedisService.createJwtRefreshTokenKey(jwtUserDto);
|
|
|
+ // 登录成功
|
|
|
+ return new LoginToken(token, refreshToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public LoginToken refreshToken(String refreshToken) {
|
|
|
+ // 解析refresh token
|
|
|
+ JwtUserDto jwtUserDto = jwtManager.decodeJwt(refreshToken);
|
|
|
|
|
|
- // 将token存入redis
|
|
|
- loginRedisService.loginSaveCache(redisTokenKey, userDetailInRedis, token_expires);
|
|
|
- loginRedisService.loginSaveCache(redisRefreshTokenKey, userDetailInRedis, refreshToken_expires);
|
|
|
+ //生成新的 刷新k值 (refresh_token)
|
|
|
+ String newRedisRefreshTokenKey = loginRedisService.createJwtRefreshTokenKey(jwtUserDto);
|
|
|
|
|
|
- // 登录成功
|
|
|
- return new LoginToken(token, refreshToken);
|
|
|
+ //查询redis里面有没有这个k值
|
|
|
+ UserDetail userDetailInRedis = loginRedisService.loginGetCache(newRedisRefreshTokenKey);
|
|
|
+ if (userDetailInRedis == null) {
|
|
|
+ throw new EasException("refresh token已过期", 412);
|
|
|
+ }
|
|
|
+ //如果不为空 那UserDetail里面就封装了用户的信息 生成新的token和refresh token
|
|
|
+ String newToken = jwtManager.createJwt(jwtUserDto, token_expires);
|
|
|
+ String newRefreshToken = jwtManager.createJwt(jwtUserDto, refreshToken_expires);
|
|
|
+
|
|
|
+ //生成新的k值 (token)
|
|
|
+ String newRedisTokenKey = loginRedisService.createJwtTokenKey(jwtUserDto);
|
|
|
+
|
|
|
+ // 更新Redis中的token和refresh token
|
|
|
+ loginRedisService.loginSaveCache(newRedisTokenKey, userDetailInRedis, token_expires);
|
|
|
+ loginRedisService.loginSaveCache(newRedisRefreshTokenKey, userDetailInRedis, refreshToken_expires);
|
|
|
+ return new LoginToken(newToken, newRefreshToken);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
private EasSysUserinfo findAdminByUsername(String username, String password) {
|
|
|
EasSysUserinfoExample easSysUserinfoExample = new EasSysUserinfoExample();
|
|
|
easSysUserinfoExample.createCriteria().andUsernameEqualTo(username);
|
|
@@ -98,11 +128,14 @@ public class AdminLoginServiceImpl implements AdminLoginService {
|
|
|
}
|
|
|
|
|
|
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);
|