package jnpf.listener; import cn.dev33.satoken.listener.SaTokenListenerForSimple; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.parameter.SaLoginParameter; import jnpf.base.LogApi; import jnpf.base.UserInfo; import jnpf.message.SentMessageApi; import jnpf.permission.UserApi; import jnpf.permission.entity.UserEntity; import jnpf.permission.model.user.UserUpdateModel; import jnpf.util.DateUtil; import jnpf.util.IpUtil; import jnpf.util.UserProvider; import jnpf.utils.LoginHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * * @author JNPF开发平台组 * @copyright 引迈信息技术有限公司 */ @Component @Slf4j public class LoginListener extends SaTokenListenerForSimple { @Autowired private SentMessageApi messageApi; @Autowired private LogApi logApi; @Autowired private UserApi userApi; @Override public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginModel) { println("用户登录:{}, 设备:{}, TOKEN:{}", loginId, loginType, tokenValue); UserInfo userInfo = UserProvider.getUser(); //临时用户登录不记录 if(!UserProvider.isTempUser(userInfo)) { UserEntity entity = LoginHolder.getUserEntity(); entity.setLogErrorCount(0); entity.setUnlockTime(null); entity.setEnabledMark(1); entity.setPrevLogIp(IpUtil.getIpAddr()); entity.setPrevLogTime(DateUtil.getNowDate()); entity.setLastLogIp(IpUtil.getIpAddr()); entity.setLastLogTime(DateUtil.getNowDate()); entity.setLogSuccessCount(entity.getLogSuccessCount() != null ? entity.getLogSuccessCount() + 1 : 1); userApi.updateById(new UserUpdateModel(entity, userInfo.getTenantId())); } } @Override public void doLogout(String loginType, Object loginId, String tokenValue) { println("用户退出:{}, 设备:{}, TOKEN:{}", loginId, loginType, tokenValue); } @Override public void doKickout(String loginType, Object loginId, String tokenValue) { println("用户踢出:{}, 设备:{}, TOKEN:{}", loginId, loginType, tokenValue); messageApi.logoutWebsocketByToken(tokenValue, null); //删除用户信息缓存, 保留Token状态记录等待自动过期, 如果用户不在线下次打开浏览器会提示被踢下线 StpUtil.getTokenSessionByToken(tokenValue).logout(); } @Override public void doReplaced(String loginType, Object loginId, String tokenValue) { println("用户顶替:{}, 设备:{}, TOKEN:{}", loginId, loginType, tokenValue); messageApi.logoutWebsocketByToken(tokenValue, null); StpUtil.getTokenSessionByToken(tokenValue).logout(); } /** * 打印指定字符串 * @param str 字符串 */ public void println(String str, Object... params) { if(log.isDebugEnabled()) { log.debug(str, params); } } }