浏览代码

1.添加 AccountSessionService 用于管理帐号的会话
2.修改帐号的角色或密码后, 使其会话失效

reghao 2 年之前
父节点
当前提交
4a0f22708f

+ 53 - 0
manager/src/main/java/cn/reghao/devops/manager/account/service/AccountSessionService.java

@@ -0,0 +1,53 @@
+package cn.reghao.devops.manager.account.service;
+
+import cn.reghao.devops.manager.account.db.repository.UserRepository;
+import cn.reghao.devops.manager.account.model.po.User;
+import org.springframework.security.core.session.SessionInformation;
+import org.springframework.security.core.session.SessionRegistry;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-02-04 16:00:01
+ */
+@Service
+public class AccountSessionService {
+    private final SessionRegistry sessionRegistry;
+    private final UserRepository userRepository;
+
+    public AccountSessionService(SessionRegistry sessionRegistry, UserRepository userRepository) {
+        this.sessionRegistry = sessionRegistry;
+        this.userRepository = userRepository;
+    }
+
+    public void getActiveSessions() {
+        List<SessionInformation> activeSessionInfos = new ArrayList<>();
+        for (Object principal : sessionRegistry.getAllPrincipals()) {
+            String username = (String) principal;
+            User user = userRepository.findByUsername(username);
+            for (SessionInformation sessionInfo : sessionRegistry.getAllSessions(principal, false)) {
+                Date date = sessionInfo.getLastRequest();
+                activeSessionInfos.add(sessionInfo);
+            }
+        }
+    }
+
+    public void deactiveSession(User user) {
+        int currentUserId = UserContext.getUser().getId();
+        if (currentUserId != user.getId()) {
+            String principal = user.getUsername();
+            for (Object object : sessionRegistry.getAllPrincipals()) {
+                String username = (String) object;
+                if (username.equals(principal)) {
+                    for (SessionInformation sessionInfo : sessionRegistry.getAllSessions(principal, false)) {
+                        sessionInfo.expireNow();
+                    }
+                }
+            }
+        }
+    }
+}

+ 8 - 7
manager/src/main/java/cn/reghao/devops/manager/account/service/impl/AccountServiceImpl.java

@@ -6,9 +6,8 @@ import cn.reghao.devops.manager.account.model.constant.RoleType;
 import cn.reghao.devops.manager.account.model.dto.CreateAccountDto;
 import cn.reghao.devops.manager.account.model.po.Role;
 import cn.reghao.devops.manager.account.service.AccountService;
+import cn.reghao.devops.manager.account.service.AccountSessionService;
 import cn.reghao.jutil.jdk.result.Result;
-import cn.reghao.jutil.jdk.security.Cryptor;
-import cn.reghao.jutil.jdk.security.Md5Cryptor;
 import cn.reghao.jutil.jdk.security.RandomString;
 import cn.reghao.devops.manager.account.model.dto.AccountProfile;
 import cn.reghao.devops.manager.account.model.dto.AccountRole;
@@ -18,7 +17,6 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
-import java.security.NoSuchAlgorithmException;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -33,14 +31,15 @@ import java.util.stream.Collectors;
 public class AccountServiceImpl implements AccountService {
     private final UserRepository userRepository;
     private final RoleRepository roleRepository;
-    private final Cryptor cryptor;
     private final PasswordEncoder passwordEncoder;
+    private final AccountSessionService accountSessionService;
 
-    public AccountServiceImpl(UserRepository userRepository, RoleRepository roleRepository, PasswordEncoder passwordEncoder) throws NoSuchAlgorithmException {
+    public AccountServiceImpl(UserRepository userRepository, RoleRepository roleRepository,
+                              PasswordEncoder passwordEncoder, AccountSessionService accountSessionService) {
         this.userRepository = userRepository;
         this.roleRepository = roleRepository;
-        this.cryptor = new Md5Cryptor();
         this.passwordEncoder = passwordEncoder;
+        this.accountSessionService = accountSessionService;
     }
 
     @Override
@@ -94,10 +93,11 @@ public class AccountServiceImpl implements AccountService {
         }
 
         String salt = RandomString.getSalt(64);
-        String encodedPassword = cryptor.encrypt(newPassword + salt);
+        String encodedPassword = passwordEncoder.encode(newPassword + salt);
         userEntity.setSalt(salt);
         userEntity.setEncodedPassword(encodedPassword);
         userRepository.save(userEntity);
+        accountSessionService.deactiveSession(userEntity);
     }
 
     @Override
@@ -124,6 +124,7 @@ public class AccountServiceImpl implements AccountService {
         Set<String> roles = accountRole.getRoles().stream().map(Role::getName).collect(Collectors.toSet());
         userEntity.setRole(roles);
         userRepository.save(userEntity);
+        accountSessionService.deactiveSession(userEntity);
     }
 
     @Override