Browse Source

Merge branch 'superb' of wuheng/eas-system into master

wuheng 1 year ago
parent
commit
d20aa5320f
24 changed files with 523 additions and 2 deletions
  1. 11 0
      common/src/main/java/com/koobietech/eas/common/pojo/JwtUserDto.java
  2. 17 0
      common/src/main/java/com/koobietech/eas/common/utils/JwtManager.java
  3. 2 0
      common/src/main/java/com/koobietech/eas/common/utils/PasswordManager.java
  4. 1 1
      controller/src/main/java/com/koobietech/eas/ControllerApplication.java
  5. 28 0
      controller/src/main/java/com/koobietech/eas/controller/AdminLoginController.java
  6. 2 0
      controller/src/main/java/com/koobietech/eas/controller/EasUserController.java
  7. 6 0
      controller/src/main/java/com/koobietech/eas/controller/LoginController.java
  8. 0 1
      controller/src/main/resources/application-local.yaml
  9. 10 0
      dao/src/main/java/com/koobietech/eas/dao/Pojo/AdminPojo.java
  10. 17 0
      dao/src/main/java/com/koobietech/eas/dao/adminLoginPojo/Department.java
  11. 15 0
      dao/src/main/java/com/koobietech/eas/dao/adminLoginPojo/Permission.java
  12. 16 0
      dao/src/main/java/com/koobietech/eas/dao/adminLoginPojo/UserDetail.java
  13. 13 0
      dao/src/main/java/com/koobietech/eas/dao/dto/LoginToken.java
  14. 18 0
      dao/src/main/java/com/koobietech/eas/dao/mapper/AdminLoginMapper.java
  15. 84 0
      dao/src/main/resources/com/koobietech/eas/dao/mapper/AdminLoginMapper.xml
  16. 0 0
      git
  17. 6 0
      security/pom.xml
  18. 7 0
      security/src/main/java/com/koobietech/eas/security/config/SecurityConfig.java
  19. 59 0
      security/src/main/java/com/koobietech/eas/security/filter/EasSecurityFilter.java
  20. 5 0
      service/pom.xml
  21. 9 0
      service/src/main/java/com/koobietech/eas/service/AdminLoginService.java
  22. 17 0
      service/src/main/java/com/koobietech/eas/service/LoginRedisService.java
  23. 129 0
      service/src/main/java/com/koobietech/eas/service/impl/AdminLoginServiceImpl.java
  24. 51 0
      service/src/main/java/com/koobietech/eas/service/impl/LoginRedisServiceImpl.java

+ 11 - 0
common/src/main/java/com/koobietech/eas/common/pojo/JwtUserDto.java

@@ -1,5 +1,6 @@
 package com.koobietech.eas.common.pojo;
 
+import com.koobietech.eas.common.constant.UserType;
 import lombok.Data;
 
 @Data
@@ -7,4 +8,14 @@ public class JwtUserDto {
     String username;
     Long id;
     Enum type;
+
+    public JwtUserDto(String username, Long id, Enum type) {
+        this.username = username;
+        this.id = id;
+        this.type = type;
+    }
+
+    public JwtUserDto() {
+
+    }
 }

+ 17 - 0
common/src/main/java/com/koobietech/eas/common/utils/JwtManager.java

@@ -39,6 +39,23 @@ public class JwtManager {
         return sign;
     }
 
+    /**
+     * 创建 token
+     * @param userDto
+     * @return
+     */
+    public String createJwt(JwtUserDto userDto, Integer expires){
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(calendar.DATE, expires);
+        String sign = JWT.create()
+                .withClaim("user", userDto.getUsername())
+                .withClaim("id", userDto.getId())
+                .withClaim("type", userDto.getType().toString())
+                .withExpiresAt( calendar.getTime() )
+                .sign(Algorithm.HMAC256(SECRET));
+        return sign;
+    }
+
     /**
      * 解密 Token
      * @param token

+ 2 - 0
common/src/main/java/com/koobietech/eas/common/utils/PasswordManager.java

@@ -4,10 +4,12 @@ import cn.hutool.crypto.SecureUtil;
 import cn.hutool.crypto.symmetric.AES;
 import com.koobietech.eas.common.exception.EasException;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
 
 
 import java.nio.charset.StandardCharsets;
 
+@Component
 public class PasswordManager {
 
 

+ 1 - 1
controller/src/main/java/com/koobietech/eas/ControllerApplication.java

@@ -7,7 +7,7 @@ import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.FilterType;
 
 @SpringBootApplication
-@MapperScan(basePackages = {"com.koobietech.eas.mbg.mapper"})
+@MapperScan(basePackages = {"com.koobietech.eas.mbg.mapper","com.koobietech.eas.dao.mapper"})
 @ComponentScan(basePackages = {"com.koobietech.eas"}, excludeFilters = {
         @ComponentScan.Filter(type = FilterType.REGEX, pattern  = {
                 "com.koobietech.eas.mbg.+"

+ 28 - 0
controller/src/main/java/com/koobietech/eas/controller/AdminLoginController.java

@@ -0,0 +1,28 @@
+package com.koobietech.eas.controller;
+
+
+import com.koobietech.eas.common.result.JsonResult;
+import com.koobietech.eas.dao.Pojo.AdminPojo;
+import com.koobietech.eas.dao.dto.LoginToken;
+import com.koobietech.eas.service.AdminLoginService;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+public class AdminLoginController {
+    @Resource
+    private AdminLoginService adminLoginService;
+
+    @RequestMapping("/adminLogin")
+    public JsonResult adminLogin(@RequestBody AdminPojo adminPojo){
+
+        LoginToken result = adminLoginService.adminLogin(adminPojo);
+
+        return JsonResult.data(result);
+    }
+
+
+}

+ 2 - 0
controller/src/main/java/com/koobietech/eas/controller/EasUserController.java

@@ -25,4 +25,6 @@ public class EasUserController {
         return demoService.test( easEduSubjects );
     }
 
+
+
 }

+ 6 - 0
controller/src/main/java/com/koobietech/eas/controller/LoginController.java

@@ -0,0 +1,6 @@
+package com.koobietech.eas.controller;
+
+public class LoginController {
+
+
+}

+ 0 - 1
controller/src/main/resources/application-local.yaml

@@ -28,4 +28,3 @@ knife4j:
 logging:
   level:
     com.koobietech.eas.*: TRACE
-

+ 10 - 0
dao/src/main/java/com/koobietech/eas/dao/Pojo/AdminPojo.java

@@ -0,0 +1,10 @@
+package com.koobietech.eas.dao.Pojo;
+
+import lombok.Data;
+
+@Data
+public class AdminPojo {
+    private String username;
+    private String passwd;
+
+}

+ 17 - 0
dao/src/main/java/com/koobietech/eas/dao/adminLoginPojo/Department.java

@@ -0,0 +1,17 @@
+package com.koobietech.eas.dao.adminLoginPojo;
+
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class Department {
+    private Long id;
+    private String depname;
+    private String address;
+    private String phone;
+    private String email;
+    private String manager;
+    private Date createTime;
+    private Date modifyTime;
+    private Integer createUid;
+}

+ 15 - 0
dao/src/main/java/com/koobietech/eas/dao/adminLoginPojo/Permission.java

@@ -0,0 +1,15 @@
+package com.koobietech.eas.dao.adminLoginPojo;
+
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class Permission {
+    private Integer id;
+    private String name;
+    private Byte isActive;
+    private Date createTime;
+    private Date modifyTime;
+    private Integer createUid;
+    private String description;
+}

+ 16 - 0
dao/src/main/java/com/koobietech/eas/dao/adminLoginPojo/UserDetail.java

@@ -0,0 +1,16 @@
+package com.koobietech.eas.dao.adminLoginPojo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserDetail {
+    private Long id;
+    private String username;
+    private String phone;
+    private String email;
+    private List<Permission> permissions;
+    private List<Department> departments;
+
+}

+ 13 - 0
dao/src/main/java/com/koobietech/eas/dao/dto/LoginToken.java

@@ -0,0 +1,13 @@
+package com.koobietech.eas.dao.dto;
+
+import lombok.Data;
+
+@Data
+public class LoginToken {
+    String token;
+    String refreshToken;
+    public LoginToken(String token, String refreshToken) {
+        this.token = token;
+        this.refreshToken = refreshToken;
+    }
+}

+ 18 - 0
dao/src/main/java/com/koobietech/eas/dao/mapper/AdminLoginMapper.java

@@ -0,0 +1,18 @@
+package com.koobietech.eas.dao.mapper;
+
+import com.koobietech.eas.dao.adminLoginPojo.Department;
+import com.koobietech.eas.dao.adminLoginPojo.Permission;
+import com.koobietech.eas.dao.adminLoginPojo.UserDetail;
+
+import java.util.List;
+
+public interface AdminLoginMapper {
+    List<Permission> getUserPermissionsById(Long adminId);
+
+    List<Department> getUserDepartmentsById(Long adminId);
+
+    UserDetail getUserDetailById(Long adminId);
+
+
+
+}

+ 84 - 0
dao/src/main/resources/com/koobietech/eas/dao/mapper/AdminLoginMapper.xml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.koobietech.eas.dao.mapper.AdminLoginMapper">
+    <resultMap id="permissionResultMap" type="com.koobietech.eas.dao.adminLoginPojo.Permission">
+        <!-- 映射查询结果到实体类属性 -->
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="is_active" property="isActive"/>
+        <result column="create_time" property="createTime"/>
+        <result column="modify_time" property="modifyTime"/>
+        <result column="create_uid" property="createUid"/>
+        <result column="description" property="description"/>
+    </resultMap>
+
+    <resultMap id="departmentResultMap" type="com.koobietech.eas.dao.adminLoginPojo.Department">
+        <!-- 映射查询结果到实体类属性 -->
+        <id column="id" property="id"/>
+        <result column="depname" property="depname"/>
+        <result column="address" property="address"/>
+        <result column="phone" property="phone"/>
+        <result column="email" property="email"/>
+        <result column="manager" property="manager"/>
+        <result column="create_time" property="createTime"/>
+        <result column="modify_time" property="modifyTime"/>
+        <result column="create_uid" property="createUid"/>
+    </resultMap>
+
+    <resultMap id="userDetailResultMap" type="com.koobietech.eas.dao.adminLoginPojo.UserDetail">
+        <!-- 映射查询结果到实体类属性 -->
+        <result column="id" property="id"/>
+        <result column="username" property="username"/>
+        <result column="phone" property="phone"/>
+        <result column="email" property="email"/>
+    </resultMap>
+
+
+
+
+<!--    <resultMap id="userDetailResultMap" type="com.koobietech.eas.dao.adminLoginPojo.UserDetail">-->
+<!--        &lt;!&ndash; 映射查询结果到实体类属性 &ndash;&gt;-->
+<!--        <result column="id" property="id" />-->
+<!--        <result column="username" property="username" />-->
+<!--        <result column="phone" property="phone" />-->
+<!--        <result column="email" property="email" />-->
+<!--        <collection property="departments" ofType="com.koobietech.eas.dao.adminLoginPojo.Department">-->
+<!--            <id column="dep_id" property="id" />-->
+<!--            <result column="depname" property="depname" />-->
+<!--            &lt;!&ndash; 其他部门属性的映射 &ndash;&gt;-->
+<!--        </collection>-->
+<!--        <collection property="permissions" ofType="com.koobietech.eas.dao.adminLoginPojo.Permission">-->
+<!--            <id column="per_id" property="id" />-->
+<!--            <result column="name" property="name" />-->
+<!--            &lt;!&ndash; 其他权限属性的映射 &ndash;&gt;-->
+<!--        </collection>-->
+<!--    </resultMap>-->
+
+
+
+
+
+
+    <select id="getUserPermissionsById" resultMap="permissionResultMap">
+        SELECT p.id, p.name, p.is_active, p.create_time, p.modify_time, p.create_uid, p.description
+        FROM eas_sys_userinfo u
+                 JOIN eas_sys_pes_relation pr ON u.id = pr.department_id
+                 JOIN eas_sys_permission p ON pr.permission_id = p.id
+        WHERE u.id = #{adminId};
+    </select>
+
+    <select id="getUserDepartmentsById" resultMap="departmentResultMap">
+        SELECT DISTINCT d.id, d.depname, d.address, d.phone, d.email, d.manager, d.create_time, d.modify_time, d.create_uid
+        FROM eas_sys_userinfo u
+                 JOIN eas_sys_pes_relation pr ON u.id = pr.department_id
+                 JOIN eas_sys_department d ON pr.department_id = d.id
+        WHERE u.id = #{adminId}
+    </select>
+
+    <select id="getUserDetailById" resultMap="userDetailResultMap">
+        SELECT id, username, phone, email
+        FROM eas_sys_userinfo
+        WHERE id = #{adminId}
+    </select>
+
+</mapper>

+ 0 - 0
git


+ 6 - 0
security/pom.xml

@@ -27,6 +27,12 @@
             <artifactId>spring-boot-starter-security</artifactId>
             <version>${spring-boot.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.koobietech.eas</groupId>
+            <artifactId>service</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <repositories>

+ 7 - 0
security/src/main/java/com/koobietech/eas/security/config/SecurityConfig.java

@@ -7,6 +7,8 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
 import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
@@ -43,4 +45,9 @@ public class SecurityConfig {
 
         return and.build();
     }
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder();
+    }
 }

+ 59 - 0
security/src/main/java/com/koobietech/eas/security/filter/EasSecurityFilter.java

@@ -1,9 +1,23 @@
 package com.koobietech.eas.security.filter;
 
+import com.koobietech.eas.common.pojo.JwtUserDto;
+import com.koobietech.eas.common.utils.JwtManager;
+import com.koobietech.eas.dao.adminLoginPojo.Permission;
+import com.koobietech.eas.dao.adminLoginPojo.UserDetail;
+import com.koobietech.eas.service.LoginRedisService;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
 import org.springframework.web.filter.OncePerRequestFilter;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import javax.annotation.Resource;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -12,9 +26,54 @@ import javax.servlet.http.HttpServletResponse;
 @Component
 public class EasSecurityFilter extends OncePerRequestFilter {
 
+    @Resource
+    private LoginRedisService loginRedisService;
+
+    @Resource
+    JwtManager jwtManager;
 
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
+        //在这里添加Token判断
+        System.out.println("EasSecurityFilter");
+        //从请求里面拿到token
+        String token = request.getHeader(request.getHeader("Authorization"));
+        //判断token是否存在
+        if (StringUtils.hasText(token)) {
+            //解析token成JwtUserDto
+            JwtUserDto jwtUserDto = jwtManager.decodeJwt(token);
+            //判断token是否有效
+            UserDetail userDetail = loginRedisService.checkToken(jwtUserDto);
+
+            // 获取当前的 SecurityContext 对象,用于保存当前用户的安全上下文信息
+            SecurityContext context = SecurityContextHolder.getContext();
+
+            if (Objects.nonNull(userDetail)) {
+                // 如果获取到了有效的用户对象
+
+                // 获取用户的权限列表
+                List<Permission> permission = userDetail.getPermissions();
+
+                // 创建一个 ArrayList 集合,用于存储用户权限对应的 SimpleGrantedAuthority 权限对象
+                ArrayList<SimpleGrantedAuthority> objects = new ArrayList<>();
+
+                // 遍历用户的权限列表
+                for (Permission adminPermission: permission) {
+                    // 创建一个 SimpleGrantedAuthority 权限对象,并添加到集合中
+                    SimpleGrantedAuthority authority = new SimpleGrantedAuthority(adminPermission.getDescription());
+                    objects.add(authority);
+                }
+
+                // 使用用户的用户名、空凭证参数和权限对象集合创建一个 UsernamePasswordAuthenticationToken 身份验证令牌
+                UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetail.getUsername(), null, objects);
+
+                // 将身份验证令牌设置到当前的 SecurityContext 中
+                context.setAuthentication(authenticationToken);
+            }
+        }
+
         filterChain.doFilter(request, response);
     }
+
+
 }

+ 5 - 0
service/pom.xml

@@ -38,6 +38,11 @@
             <version>0.0.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.koobietech.eas</groupId>
+            <artifactId>security</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
     <parent>

+ 9 - 0
service/src/main/java/com/koobietech/eas/service/AdminLoginService.java

@@ -0,0 +1,9 @@
+package com.koobietech.eas.service;
+
+import com.koobietech.eas.common.result.JsonResult;
+import com.koobietech.eas.dao.Pojo.AdminPojo;
+import com.koobietech.eas.dao.dto.LoginToken;
+
+public interface AdminLoginService {
+    LoginToken adminLogin(AdminPojo adminPojo);
+}

+ 17 - 0
service/src/main/java/com/koobietech/eas/service/LoginRedisService.java

@@ -0,0 +1,17 @@
+package com.koobietech.eas.service;
+
+import com.koobietech.eas.common.pojo.JwtUserDto;
+import com.koobietech.eas.dao.adminLoginPojo.UserDetail;
+
+
+public interface LoginRedisService {
+    UserDetail checkToken(JwtUserDto jwtUserDto);
+
+    UserDetail checkRefreshToken(JwtUserDto jwtUserDto);
+
+    void loginSaveCache(String redisTokenKey, UserDetail userDetailInRedis, Integer token_expires);
+
+    String createJwtTokenKey(JwtUserDto jwtUserDto);
+
+    String createJwtRefreshTokenKey(JwtUserDto jwtUserDto);
+}

+ 129 - 0
service/src/main/java/com/koobietech/eas/service/impl/AdminLoginServiceImpl.java

@@ -0,0 +1,129 @@
+package com.koobietech.eas.service.impl;
+
+import com.koobietech.eas.common.config.MessageConfigProperties;
+import com.koobietech.eas.common.constant.UserType;
+import com.koobietech.eas.common.exception.EasException;
+import com.koobietech.eas.common.exception.InvalidUserException;
+import com.koobietech.eas.common.exception.NonUniqueResultException;
+import com.koobietech.eas.common.exception.PasswordIncorrectException;
+import com.koobietech.eas.common.pojo.JwtUserDto;
+import com.koobietech.eas.common.result.JsonResult;
+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 MessageConfigProperties messageConfigProperties;
+    @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);
+        }
+
+        try {
+            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);
+        } catch (InvalidUserException e) {
+            throw new EasException("用户不存在", 409);
+        } catch (NonUniqueResultException e) {
+            throw new EasException("用户不存在", 409);
+        } catch (PasswordIncorrectException e) {
+            throw new EasException("用户不存在", 409);
+        }
+    }
+
+    private EasSysUserinfo findAdminByUsername(String username, String password) throws InvalidUserException, NonUniqueResultException, PasswordIncorrectException {
+        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 InvalidUserException();
+        }
+        if (adminList.size() > 1) {
+            throw new NonUniqueResultException();
+        }
+
+        EasSysUserinfo easSysUserinfo = optionalAdmin.get();
+        validatePassword(password, easSysUserinfo.getPasswd());
+
+        return easSysUserinfo;
+    }
+
+    private void validatePassword(String inputPassword, String encryptedPassword) throws PasswordIncorrectException {
+        String decryptedPassword = passwordManager.decryptPassword(inputPassword);
+        System.out.println("前端解密来的decryptedPassword: " + decryptedPassword);
+        System.out.println("数据库查到的密码easSysUserinfo.getPasswd(): " + encryptedPassword);
+        if (!passwordEncoder.matches(decryptedPassword, encryptedPassword)) {
+            throw new PasswordIncorrectException();
+        }
+    }
+}

+ 51 - 0
service/src/main/java/com/koobietech/eas/service/impl/LoginRedisServiceImpl.java

@@ -0,0 +1,51 @@
+package com.koobietech.eas.service.impl;
+
+import com.koobietech.eas.common.exception.EasException;
+import com.koobietech.eas.common.pojo.JwtUserDto;
+import com.koobietech.eas.common.service.RedisService;
+import com.koobietech.eas.dao.adminLoginPojo.UserDetail;
+import com.koobietech.eas.service.LoginRedisService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoginRedisServiceImpl implements LoginRedisService {
+
+    @Autowired
+    RedisService redisService;
+
+
+    @Override
+    public UserDetail checkToken(JwtUserDto jwtUserDto) {
+        String jwtKey = createJwtTokenKey(jwtUserDto);
+        //判断redis里面是否有这个key
+        if (!redisService.hasKey(jwtKey)) {
+            throw new EasException("token已过期");
+        }
+        return (UserDetail) redisService.get(jwtKey);
+    }
+
+    @Override
+    public UserDetail checkRefreshToken(JwtUserDto jwtUserDto) {
+        String jwtKey = createJwtTokenKey(jwtUserDto);
+
+        return (UserDetail) redisService.get(jwtKey);
+    }
+
+    @Override
+    public void loginSaveCache(String redisTokenKey, UserDetail userDetailInRedis, Integer token_expires) {
+        redisService.set(redisTokenKey, userDetailInRedis, token_expires);
+    }
+
+    @Override
+    public String createJwtTokenKey(JwtUserDto jwtUserDto) {
+        //根据jwtUserDto 生成jwtKey,格式为:eas_token_{id}_{username}_{type}
+        return "eas_token_" + jwtUserDto.getId() + "_" + jwtUserDto.getUsername() + "_" + jwtUserDto.getType();
+    }
+
+    @Override
+    public String createJwtRefreshTokenKey(JwtUserDto jwtUserDto) {
+        //根据jwtUserDto 生成jwtKey,格式为:eas_refresh_{id}_{username}_{type}
+        return "eas_refresh_" + jwtUserDto.getId() + "_" + jwtUserDto.getUsername() + "_" + jwtUserDto.getType();
+    }
+}