Просмотр исходного кода

feat:完成门户请求在未登录情况下直接由token进行身份认证工作

BaiQi 1 год назад
Родитель
Сommit
7a57ffa95e

+ 40 - 1
src/main/java/com/njuzr/eaibackend/config/JWTAuthenticationFilter.java

@@ -1,7 +1,11 @@
 package com.njuzr.eaibackend.config;
 
+import com.njuzr.eaibackend.dto.user.UserRegisterDTO;
+import com.njuzr.eaibackend.dto.user.UserUpdateDTO;
+import com.njuzr.eaibackend.enums.Role;
 import com.njuzr.eaibackend.exception.MyAuthenticationEntryPoint;
 import com.njuzr.eaibackend.service.MyUserDetailService;
+import com.njuzr.eaibackend.service.UserService;
 import com.njuzr.eaibackend.utils.JWTTokenUtil;
 import jakarta.servlet.FilterChain;
 import jakarta.servlet.ServletException;
@@ -16,6 +20,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.filter.OncePerRequestFilter;
 
 import java.io.IOException;
+import java.util.Map;
 
 /**
  * @author: Leonezhurui
@@ -29,12 +34,14 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
 
     private final JWTTokenUtil jwtTokenUtil;
     private final MyUserDetailService userDetailService;
+    private final UserService userService;
 
     private final MyAuthenticationEntryPoint authenticationEntryPoint = new MyAuthenticationEntryPoint();
 
-    public JWTAuthenticationFilter(JWTTokenUtil jwtTokenUtil, MyUserDetailService userDetailService) {
+    public JWTAuthenticationFilter(JWTTokenUtil jwtTokenUtil, MyUserDetailService userDetailService, UserService userService) {
         this.jwtTokenUtil = jwtTokenUtil;
         this.userDetailService = userDetailService;
+        this.userService = userService;
     }
 
     @Override
@@ -47,6 +54,38 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
             if (token != null) {
                 String username = jwtTokenUtil.parseToken(token);
                 log.info("解析出username:" + username);
+                Map<String, Object> userInfoMap = jwtTokenUtil.parseClaim(token).getBody().get("user_info", Map.class);
+
+                // 不为空则认为是门户请求
+                if(userInfoMap != null){
+                    log.info("解析出的用户信息:{}", userInfoMap.toString());
+                    //pid:门户用户id
+                    Integer pid = Integer.valueOf(userInfoMap.get("id").toString());
+                    String name = userInfoMap.get("name").toString();
+                    String email = userInfoMap.get("email").toString();
+                    String phone = userInfoMap.get("phone").toString();
+                    Role role = Role.valueOf(userInfoMap.get("role").toString());
+                    // 如果EAI数据库中没有该用户,则添加该用户
+                    if (!userService.userExists(pid)) {
+                        log.info("用户不存在,添加用户{}", phone);
+                        UserRegisterDTO reg = new UserRegisterDTO();
+                        reg.setPid(pid);
+                        reg.setOfficialEmail(email);
+                        reg.setOfficialNumber(username);
+                        reg.setPhone(phone);
+                        reg.setRole(role);
+                        reg.setName(name);
+                        reg.setPassword("no_password");
+                        userService.createUser(reg);
+                    } else {
+                        // 否则更新用户信息
+                        UserUpdateDTO update = new UserUpdateDTO();
+                        update.setContentEmail(email);
+                        update.setPhone(phone);
+                        userService.updateUserByPid(pid, update);
+                    }
+                }
+
                 UserDetails userDetails = userDetailService.loadUserByUsername(username);
                 log.info("解析出UserDetails:" + userDetails);
 

+ 3 - 0
src/main/java/com/njuzr/eaibackend/dto/user/UserRegisterDTO.java

@@ -34,5 +34,8 @@ public class UserRegisterDTO { // 用户注册,前传后
     @NotNull(message = "role不能为空")
     private Role role; // 用户角色:学生、教师、管理员(必填)
 
+    @NotNull(message = "phone不能为空")
+    private String phone;
+
     private Integer pid; // 用户门户id
 }

+ 2 - 1
src/main/java/com/njuzr/eaibackend/service/impl/AuthenticationServiceImpl.java

@@ -120,7 +120,8 @@ public class AuthenticationServiceImpl implements AuthenticationService {
             UserRegisterDTO reg = new UserRegisterDTO();
             reg.setPid(pid);
             reg.setOfficialEmail(email);
-            reg.setOfficialNumber(phone);
+            reg.setOfficialNumber(username);
+            reg.setPhone(phone);
             reg.setRole(role);
             reg.setName(name);
             reg.setPassword("no_password");