zhaowenyu
2026-03-07 d7fef91a4cbb702988dc820bcde82c166253ceec
ard-framework/src/main/java/com/ard/framework/security/handle/CustomAuthenticationSuccessHandler.java
@@ -2,21 +2,45 @@
import com.ard.common.constant.CacheConstants;
import com.ard.common.constant.Constants;
import com.ard.common.core.domain.model.LoginUser;
import com.ard.common.core.redis.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
@Component
public class CustomAuthenticationSuccessHandler {
    @Value("${token.soloLogin}")
    private boolean soloLogin;
    @Autowired
    private RedisCache redisCache;
    public void onAuthenticationSuccess(Long userId) {
    @Autowired
    private ApplicationEventPublisher publisher;
    public void onAuthenticationSuccess(Authentication authentication) {
        // 允许多端登录,直接放行
        if (soloLogin) {
            return;
        }
        // 检查 Redis 中是否已有该用户登录
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        Long userId = loginUser.getUser().getUserId();
        String key = CacheConstants.LOGIN_USERID_KEY + userId;
        if (redisCache.hasKey(key)) {
            throw new RuntimeException("用户已登录,请勿重复登录");
        }
        // 登录成功事件推送
        if (authentication != null && authentication.isAuthenticated()) {
            publisher.publishEvent(new AuthenticationSuccessEvent(authentication));
        }
    }
}