package com.ard.framework.security.handle; 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; @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)); } } }