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));
|
}
|
}
|
|
}
|