baiqi 1 год назад
Родитель
Сommit
bef2779ae0
1 измененных файлов с 48 добавлено и 47 удалено
  1. 48 47
      src/main/java/com/njuzr/eaibackend/config/JWTAuthenticationFilter.java

+ 48 - 47
src/main/java/com/njuzr/eaibackend/config/JWTAuthenticationFilter.java

@@ -44,62 +44,33 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
         this.userService = userService;
     }
 
-    // TODO 原登录jwtTokenUtil.parseToken(token)获得的是学号,门户是手机号
+    // 原登录jwtTokenUtil.parseToken(token)获得的是学号,门户是手机号
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
             throws ServletException, IOException {
         String token = request.getHeader("Authorization");
-        log.info("从Header中解析出Token:" + token);
+        log.info("doFilterInternal get token: {}", token);
 
         try {
-            if (token != null) {
-                // 注意提取到的是手机号
-                String phone = jwtTokenUtil.parseToken(token);
-                log.info("解析出phone:" + phone);
-                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 username = userInfoMap.get("username").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.createUserByPortal(reg);
-                    } else {
-                        log.info("用户存在,更新用户{}", phone);
-                        // 否则更新用户信息
-                        UserUpdateDTO update = new UserUpdateDTO();
-                        update.setContentEmail(email);
-                        // 同时为账号添加对应权限
-                        update.setRole(role);
-//                        update.setPhone(phone);
-                        update.setOfficialNumber(username);
-                        userService.updateUserByPid(pid, update);
-                    }
-                }
-                UserDetails userDetails = userDetailService.loadUserByUsername(phone);
-                log.info("解析出UserDetails:" + userDetails);
+            if(token == null) {
+                chain.doFilter(request, response);
+            }
 
-                // 设置principal和权限
-                UsernamePasswordAuthenticationToken authentication =
-                        new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
-                SecurityContextHolder.getContext().setAuthentication(authentication);
+            String phone = jwtTokenUtil.parseToken(token);
+            Map<String, Object> userInfoMap = jwtTokenUtil.parseClaim(token).getBody().get("user_info", Map.class);
+            // 不为空则认为是门户请求,此时同步用户信息
+            if(userInfoMap != null){
+                syncUserInfo(userInfoMap, phone);
             }
 
+            UserDetails userDetails = userDetailService.loadUserByUsername(phone);
+            log.info("doFilterInternal userDetails:{}", userDetails);
+
+            // 设置principal和权限
+            UsernamePasswordAuthenticationToken authentication =
+                    new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
+            SecurityContextHolder.getContext().setAuthentication(authentication);
+
             chain.doFilter(request, response);
          } catch (CredentialsExpiredException e) {
             // 将异常传递给AuthenticationEntryPoint处理(必要的步骤)
@@ -107,4 +78,34 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
         }
 
     }
+
+    private void syncUserInfo(Map<String, Object> userInfoMap, String phone) {
+        log.info("syncUserInfo user info in token:{}", userInfoMap.toString());
+        Integer pid = Integer.valueOf(userInfoMap.get("id").toString());
+        String name = userInfoMap.get("name").toString();
+        String email = userInfoMap.get("email").toString();
+        String username = userInfoMap.get("username").toString();
+        Role role = Role.valueOf(userInfoMap.get("role").toString());
+        // 如果EAI数据库中没有该用户,则添加该用户
+        if (!userService.userExists(pid)) {
+            log.info("syncUserInfo user don't exist, add: {}", 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.createUserByPortal(reg);
+        } else {
+            log.info("syncUserInfo user exist, update: {}", phone);
+            UserUpdateDTO update = new UserUpdateDTO();
+            update.setContentEmail(email);
+            update.setRole(role);
+            update.setPhone(phone);
+            update.setOfficialNumber(username);
+            userService.updateUserByPid(pid, update);
+        }
+    }
 }