Przeglądaj źródła

登录和鉴权

wangliang 5 lat temu
rodzic
commit
40f634ed64

+ 23 - 1
themis-backend/src/main/java/com/qmth/themis/backend/api/TBUserController.java

@@ -10,12 +10,16 @@ import com.qmth.themis.business.entity.TBUser;
 import com.qmth.themis.business.service.EhcacheService;
 import com.qmth.themis.business.service.TBSessionService;
 import com.qmth.themis.business.service.TBUserService;
+import com.qmth.themis.business.util.EhcacheUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.SessionUtil;
 import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.Platform;
+import com.qmth.themis.common.enums.Source;
 import com.qmth.themis.common.exception.BusinessException;
+import com.qmth.themis.common.signature.SignatureInfo;
+import com.qmth.themis.common.signature.SignatureType;
 import com.qmth.themis.common.util.AesUtil;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
@@ -105,8 +109,11 @@ public class TBUserController {
         TBSession tbSession = tbSessionService.saveSessionInfo(sessionId, user.getId(), authDto.getRoleEnum().name(), platform.name(), platform.getSource(), deviceId, token, request.getLocalAddr(), expire);
         RedisUtil.setUserSession(sessionId, tbSession);
 
+        //测试
+        String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);
         Map<String, Object> map = new HashMap<>();
-        map.put(SystemConstant.ACCESS_TOKEN, token);
+//        map.put(SystemConstant.ACCESS_TOKEN, token);
+        map.put(SystemConstant.ACCESS_TOKEN, test);
         map.put(SystemConstant.ACCOUNT, user);
         map.put(SystemConstant.SESSION_ID, sessionId);
         return ResultUtil.ok(map);
@@ -122,11 +129,26 @@ public class TBUserController {
     @RequestMapping(value = "/logout", method = RequestMethod.GET)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result logout(HttpServletRequest request) throws NoSuchAlgorithmException {
+        TBUser tbUser = (TBUser) ServletUtil.getRequestAccount(request);
         TBSession tbSession = (TBSession) ServletUtil.getRequestSession(request);
+        AuthDto authDto = (AuthDto) EhcacheUtil.get(SystemConstant.AUTH_CACHE, tbUser.getId());
         if (Objects.isNull(tbSession)) {
             throw new BusinessException(ExceptionResultEnum.LOGIN_NO);
         }
         RedisUtil.deleteUserSession(tbSession.getId());
+        //循环检查该用户下其他平台是否存在session,不存在则删除用户缓存和鉴权缓存
+        boolean delete = true;
+        for (Source s : Source.values()) {
+            String sessionId = SessionUtil.digest(tbUser.getId(), authDto.getRoleEnum().name(), s.name());
+            if (Objects.nonNull(RedisUtil.getUserSession(sessionId))) {
+                delete = false;
+                break;
+            }
+        }
+        if (delete) {
+            RedisUtil.deleteUser(tbUser.getId());
+            ehcacheService.removeAccountCache(tbUser.getId());
+        }
         return ResultUtil.ok(JSONObject.parseObject(SystemConstant.SUCCESS));
     }
 }

+ 2 - 14
themis-backend/src/main/java/com/qmth/themis/backend/util/ServletUtil.java

@@ -123,13 +123,7 @@ public class ServletUtil {
      * @return
      */
     public static Object getRequestSession(HttpServletRequest httpRequest) {
-        // 从header中获取session
-        Object session = httpRequest.getHeader(SystemConstant.SESSION);
-        // 如果header中不存在session,则从参数中获取session
-        if (Objects.isNull(session)) {
-            session = httpRequest.getParameter(SystemConstant.SESSION);
-        }
-        return session;
+        return httpRequest.getAttribute(SystemConstant.SESSION);
     }
 
     /**
@@ -139,12 +133,6 @@ public class ServletUtil {
      * @return
      */
     public static Object getRequestAccount(HttpServletRequest httpRequest) {
-        // 从header中获取account
-        Object account = httpRequest.getHeader(SystemConstant.ACCOUNT);
-        // 如果header中不存在account,则从参数中获取account
-        if (Objects.isNull(account)) {
-            account = httpRequest.getParameter(SystemConstant.ACCOUNT);
-        }
-        return account;
+        return httpRequest.getAttribute(SystemConstant.ACCOUNT);
     }
 }