From cf1696e0d6f148445bb21dca6f066d8e07bc3234 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 15 四月 2023 09:03:41 +0800
Subject: [PATCH] 修复使用jwt后导致的用户管理功能异常

---
 /dev/null                                                                      |   36 ------------------
 src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java |   10 ++++
 src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java                |    5 ++
 src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java       |   10 -----
 src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java           |   10 +---
 src/main/java/com/genersoft/iot/vmp/conf/security/dto/JwtUser.java             |   10 +++++
 src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java          |    2 
 README.md                                                                      |    3 +
 8 files changed, 29 insertions(+), 57 deletions(-)

diff --git a/README.md b/README.md
index 9f80367..d3ad3ac 100644
--- a/README.md
+++ b/README.md
@@ -117,7 +117,8 @@
 # 鎺堟潈鍗忚
 鏈」鐩嚜鏈変唬鐮佷娇鐢ㄥ鏉剧殑MIT鍗忚锛屽湪淇濈暀鐗堟潈淇℃伅鐨勬儏鍐典笅鍙互鑷敱搴旂敤浜庡悇鑷晢鐢ㄣ�侀潪鍟嗕笟鐨勯」鐩�� 浣嗘槸鏈」鐩篃闆剁鐨勪娇鐢ㄤ簡涓�浜涘叾浠栫殑寮�婧愪唬鐮侊紝鍦ㄥ晢鐢ㄧ殑鎯呭喌涓嬭鑷鏇夸唬鎴栧墧闄わ紱 鐢变簬浣跨敤鏈」鐩�屼骇鐢熺殑鍟嗕笟绾犵悍鎴栦镜鏉冭涓轰竴姒備笌鏈」鐩強寮�鍙戣�呮棤鍏筹紝璇疯嚜琛屾壙鎷呮硶寰嬮闄┿�� 鍦ㄤ娇鐢ㄦ湰椤圭洰浠g爜鏃讹紝涔熷簲璇ュ湪鎺堟潈鍗忚涓悓鏃惰〃鏄庢湰椤圭洰渚濊禆鐨勭涓夋柟搴撶殑鍗忚
 
-# 浠樿垂鎶�鏈敮鎸�
+# 鎶�鏈敮鎸�  
+寤鸿鍔犲叆[鐭ヨ瘑鏄熺悆](https://t.zsxq.com/0drbw002x)鍙互鑾峰彇鏇村鐨勬暀绋嬩互鍙婃洿鍔犲強鏃剁殑鍥炲銆�
 濡傛灉椤圭洰闇�瑕佷竴瀵逛竴鐨勬妧鏈敮鎸侊紝鎴栬�呮鎵嬬殑闂闇�瑕佽В鍐筹紝璇峰彂閫侀偖浠跺埌648540858@qq.com
 
 # 鑷磋阿
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
index 27151ee..f35b5bd 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
@@ -2,6 +2,8 @@
 
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.conf.security.dto.JwtUser;
+import com.genersoft.iot.vmp.storager.dao.dto.Role;
+import com.genersoft.iot.vmp.storager.dao.dto.User;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -75,7 +77,13 @@
         }
 
         // 鏋勫缓UsernamePasswordAuthenticationToken,杩欓噷瀵嗙爜涓簄ull锛屾槸鍥犱负鎻愪緵浜嗘纭殑JWT,瀹炵幇鑷姩鐧诲綍
-        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, jwtUser.getPassword(), new ArrayList<>() );
+        User user = new User();
+        user.setUsername(jwtUser.getUserName());
+        user.setPassword(jwtUser.getPassword());
+        Role role = new Role();
+        role.setId(jwtUser.getRoleId());
+        user.setRole(role);
+        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user, jwtUser.getPassword(), new ArrayList<>() );
         SecurityContextHolder.getContext().setAuthentication(token);
         chain.doFilter(request, response);
     }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
index 57911b0..c9c7b68 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
@@ -37,7 +37,7 @@
      */
     public static final long expirationTime = 30;
 
-    public static String createToken(String username, String password) {
+    public static String createToken(String username, String password, Integer roleId) {
         try {
             /**
              * 鈥渋ss鈥� (issuer)  鍙戣浜�
@@ -64,6 +64,7 @@
             //娣诲姞鑷畾涔夊弬鏁�,蹇呴』鏄瓧绗︿覆绫诲瀷
             claims.setClaim("username", username);
             claims.setClaim("password", password);
+            claims.setClaim("roleId", roleId);
 
             //jws
             JsonWebSignature jws = new JsonWebSignature();
@@ -118,8 +119,10 @@
 
             String username = (String) claims.getClaimValue("username");
             String password = (String) claims.getClaimValue("password");
+            Long roleId = (Long) claims.getClaimValue("roleId");
             jwtUser.setUserName(username);
             jwtUser.setPassword(password);
+            jwtUser.setRoleId(roleId.intValue());
 
             return jwtUser;
         } catch (InvalidJwtException e) {
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/LoginFailureHandler.java b/src/main/java/com/genersoft/iot/vmp/conf/security/LoginFailureHandler.java
deleted file mode 100644
index 9bbf2e7..0000000
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/LoginFailureHandler.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.genersoft.iot.vmp.conf.security;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.*;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.AuthenticationFailureHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-@Component
-public class LoginFailureHandler implements AuthenticationFailureHandler {
-
-    private final static Logger logger = LoggerFactory.getLogger(LoginFailureHandler.class);
-
-    @Autowired
-    private ObjectMapper objectMapper;
-
-    @Override
-    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
-
-        String username = request.getParameter("username");
-        if (e instanceof AccountExpiredException) {
-            // 璐﹀彿杩囨湡
-            logger.info("[鐧诲綍澶辫触] - 鐢ㄦ埛[{}]璐﹀彿杩囨湡", username);
-
-        } else if (e instanceof BadCredentialsException) {
-            // 瀵嗙爜閿欒
-            logger.info("[鐧诲綍澶辫触] - 鐢ㄦ埛[{}]瀵嗙爜/SIP鏈嶅姟鍣↖D 閿欒", username);
-
-        } else if (e instanceof CredentialsExpiredException) {
-            // 瀵嗙爜杩囨湡
-            logger.info("[鐧诲綍澶辫触] - 鐢ㄦ埛[{}]瀵嗙爜杩囨湡", username);
-
-        } else if (e instanceof DisabledException) {
-            // 鐢ㄦ埛琚鐢�
-            logger.info("[鐧诲綍澶辫触] - 鐢ㄦ埛[{}]琚鐢�", username);
-
-        } else if (e instanceof LockedException) {
-            // 鐢ㄦ埛琚攣瀹�
-            logger.info("[鐧诲綍澶辫触] - 鐢ㄦ埛[{}]琚攣瀹�", username);
-
-        } else if (e instanceof InternalAuthenticationServiceException) {
-            // 鍐呴儴閿欒
-            logger.error(String.format("[鐧诲綍澶辫触] - [%s]鍐呴儴閿欒", username), e);
-
-        } else {
-            // 鍏朵粬閿欒
-            logger.error(String.format("[鐧诲綍澶辫触] - [%s]鍏朵粬閿欒", username), e);
-        }
-        Map<String, Object> map = new HashMap<>();
-        map.put("code","0");
-        map.put("msg","鐧诲綍澶辫触");
-        response.setContentType("application/json;charset=UTF-8");
-        response.getWriter().write(objectMapper.writeValueAsString(map));
-    }
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/LoginSuccessHandler.java b/src/main/java/com/genersoft/iot/vmp/conf/security/LoginSuccessHandler.java
deleted file mode 100644
index d26342e..0000000
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/LoginSuccessHandler.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.genersoft.iot.vmp.conf.security;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * @author lin
- */
-@Component
-public class LoginSuccessHandler implements AuthenticationSuccessHandler {
-
-    private final static Logger logger = LoggerFactory.getLogger(LoginSuccessHandler.class);
-
-    @Override
-    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
-//        String username = request.getParameter("username");
-//        httpServletResponse.setContentType("application/json;charset=UTF-8");
-//        // 鐢熸垚JWT锛屽苟鏀剧疆鍒拌姹傚ご涓�
-//        String jwt = JwtUtils.createToken(authentication.getName(), );
-//        httpServletResponse.setHeader(JwtUtils.getHeader(), jwt);
-//        ServletOutputStream outputStream = httpServletResponse.getOutputStream();
-//        outputStream.write(JSON.toJSONString(ErrorCode.SUCCESS).getBytes(StandardCharsets.UTF_8));
-//        outputStream.flush();
-//        outputStream.close();
-
-//        logger.info("[鐧诲綍鎴愬姛] - [{}]", username);
-    }
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
index a8d3568..f012f7e 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
@@ -53,14 +53,10 @@
         Authentication authentication = getAuthentication();
         if(authentication!=null){
             Object principal = authentication.getPrincipal();
-            if(principal!=null && !"anonymousUser".equals(principal)){
-//                LoginUser user = (LoginUser) authentication.getPrincipal();
+            if(principal!=null && !"anonymousUser".equals(principal.toString())){
 
-                String username = (String) principal;
-                User user = new User();
-                user.setUsername(username);
-                LoginUser loginUser = new LoginUser(user, LocalDateTime.now());
-                return loginUser;
+                User user = (User) principal;
+                return new LoginUser(user, LocalDateTime.now());
             }
         }
         return null;
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
index 96ae6b9..1fbe3a4 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
@@ -47,16 +47,6 @@
      * 鐧诲嚭鎴愬姛鐨勫鐞�
      */
     @Autowired
-    private LoginFailureHandler loginFailureHandler;
-    /**
-     * 鐧诲綍鎴愬姛鐨勫鐞�
-     */
-    @Autowired
-    private LoginSuccessHandler loginSuccessHandler;
-    /**
-     * 鐧诲嚭鎴愬姛鐨勫鐞�
-     */
-    @Autowired
     private LogoutHandler logoutHandler;
     /**
      * 鏈櫥褰曠殑澶勭悊
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/dto/JwtUser.java b/src/main/java/com/genersoft/iot/vmp/conf/security/dto/JwtUser.java
index 1639d1f..8921a30 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/dto/JwtUser.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/dto/JwtUser.java
@@ -25,6 +25,8 @@
 
     private String password;
 
+    private int roleId;
+
     private TokenStatus status;
 
     public String getUserName() {
@@ -50,4 +52,12 @@
     public void setPassword(String password) {
         this.password = password;
     }
+
+    public int getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(int roleId) {
+        this.roleId = roleId;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
index 157a3a8..5ffb02c 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
@@ -57,7 +57,7 @@
         if (user == null) {
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
         }else {
-            String jwt = JwtUtils.createToken(username, password);
+            String jwt = JwtUtils.createToken(username, password, user.getRole().getId());
             response.setHeader(JwtUtils.getHeader(), jwt);
             user.setAccessToken(jwt);
         }

--
Gitblit v1.8.0