mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	update 优化 将登录记录抽取到监听器统一处理
This commit is contained in:
		@@ -1,20 +1,24 @@
 | 
			
		||||
package org.dromara.common.satoken.listener;
 | 
			
		||||
package org.dromara.web.listener;
 | 
			
		||||
 | 
			
		||||
import cn.dev33.satoken.config.SaTokenConfig;
 | 
			
		||||
import cn.dev33.satoken.listener.SaTokenListener;
 | 
			
		||||
import cn.dev33.satoken.stp.SaLoginModel;
 | 
			
		||||
import cn.hutool.http.useragent.UserAgent;
 | 
			
		||||
import cn.hutool.http.useragent.UserAgentUtil;
 | 
			
		||||
import org.dromara.common.core.constant.CacheConstants;
 | 
			
		||||
import org.dromara.common.core.domain.dto.UserOnlineDTO;
 | 
			
		||||
import org.dromara.common.core.domain.model.LoginUser;
 | 
			
		||||
import org.dromara.common.core.enums.UserType;
 | 
			
		||||
import org.dromara.common.redis.utils.RedisUtils;
 | 
			
		||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
			
		||||
import org.dromara.common.core.utils.ip.AddressUtils;
 | 
			
		||||
import org.dromara.common.core.utils.ServletUtils;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.dromara.common.core.constant.CacheConstants;
 | 
			
		||||
import org.dromara.common.core.constant.Constants;
 | 
			
		||||
import org.dromara.common.core.domain.dto.UserOnlineDTO;
 | 
			
		||||
import org.dromara.common.core.domain.model.LoginUser;
 | 
			
		||||
import org.dromara.common.core.utils.MessageUtils;
 | 
			
		||||
import org.dromara.common.core.utils.ServletUtils;
 | 
			
		||||
import org.dromara.common.core.utils.SpringUtils;
 | 
			
		||||
import org.dromara.common.core.utils.ip.AddressUtils;
 | 
			
		||||
import org.dromara.common.log.event.LogininforEvent;
 | 
			
		||||
import org.dromara.common.redis.utils.RedisUtils;
 | 
			
		||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
			
		||||
import org.dromara.web.service.SysLoginService;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
import java.time.Duration;
 | 
			
		||||
@@ -30,37 +34,43 @@ import java.time.Duration;
 | 
			
		||||
public class UserActionListener implements SaTokenListener {
 | 
			
		||||
 | 
			
		||||
    private final SaTokenConfig tokenConfig;
 | 
			
		||||
    private final SysLoginService loginService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 每次登录时触发
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) {
 | 
			
		||||
        UserType userType = UserType.getUserType(loginId.toString());
 | 
			
		||||
        if (userType == UserType.SYS_USER) {
 | 
			
		||||
            UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
 | 
			
		||||
            String ip = ServletUtils.getClientIP();
 | 
			
		||||
            LoginUser user = LoginHelper.getLoginUser();
 | 
			
		||||
            UserOnlineDTO dto = new UserOnlineDTO();
 | 
			
		||||
            dto.setIpaddr(ip);
 | 
			
		||||
            dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
 | 
			
		||||
            dto.setBrowser(userAgent.getBrowser().getName());
 | 
			
		||||
            dto.setOs(userAgent.getOs().getName());
 | 
			
		||||
            dto.setLoginTime(System.currentTimeMillis());
 | 
			
		||||
            dto.setTokenId(tokenValue);
 | 
			
		||||
            dto.setUserName(user.getUsername());
 | 
			
		||||
            dto.setClientKey(user.getClientKey());
 | 
			
		||||
            dto.setDeviceType(user.getDeviceType());
 | 
			
		||||
            dto.setDeptName(user.getDeptName());
 | 
			
		||||
            if(tokenConfig.getTimeout() == -1) {
 | 
			
		||||
                RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
 | 
			
		||||
            } else {
 | 
			
		||||
                RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout()));
 | 
			
		||||
            }
 | 
			
		||||
            log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
 | 
			
		||||
        } else if (userType == UserType.APP_USER) {
 | 
			
		||||
            // app端 自行根据业务编写
 | 
			
		||||
        UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
 | 
			
		||||
        String ip = ServletUtils.getClientIP();
 | 
			
		||||
        LoginUser user = LoginHelper.getLoginUser();
 | 
			
		||||
        UserOnlineDTO dto = new UserOnlineDTO();
 | 
			
		||||
        dto.setIpaddr(ip);
 | 
			
		||||
        dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
 | 
			
		||||
        dto.setBrowser(userAgent.getBrowser().getName());
 | 
			
		||||
        dto.setOs(userAgent.getOs().getName());
 | 
			
		||||
        dto.setLoginTime(System.currentTimeMillis());
 | 
			
		||||
        dto.setTokenId(tokenValue);
 | 
			
		||||
        dto.setUserName(user.getUsername());
 | 
			
		||||
        dto.setClientKey(user.getClientKey());
 | 
			
		||||
        dto.setDeviceType(user.getDeviceType());
 | 
			
		||||
        dto.setDeptName(user.getDeptName());
 | 
			
		||||
        if(tokenConfig.getTimeout() == -1) {
 | 
			
		||||
            RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
 | 
			
		||||
        } else {
 | 
			
		||||
            RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout()));
 | 
			
		||||
        }
 | 
			
		||||
        // 记录登录日志
 | 
			
		||||
        LogininforEvent logininforEvent = new LogininforEvent();
 | 
			
		||||
        logininforEvent.setTenantId(user.getTenantId());
 | 
			
		||||
        logininforEvent.setUsername(user.getUsername());
 | 
			
		||||
        logininforEvent.setStatus(Constants.LOGIN_SUCCESS);
 | 
			
		||||
        logininforEvent.setMessage(MessageUtils.message("user.login.success"));
 | 
			
		||||
        logininforEvent.setRequest(ServletUtils.getRequest());
 | 
			
		||||
        SpringUtils.context().publishEvent(logininforEvent);
 | 
			
		||||
        // 更新登录信息
 | 
			
		||||
        loginService.recordLoginInfo(user.getUserId(), ip);
 | 
			
		||||
        log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -152,10 +152,10 @@ public class SysLoginService {
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 用户ID
 | 
			
		||||
     */
 | 
			
		||||
    public void recordLoginInfo(Long userId) {
 | 
			
		||||
    public void recordLoginInfo(Long userId, String ip) {
 | 
			
		||||
        SysUser sysUser = new SysUser();
 | 
			
		||||
        sysUser.setUserId(userId);
 | 
			
		||||
        sysUser.setLoginIp(ServletUtils.getClientIP());
 | 
			
		||||
        sysUser.setLoginIp(ip);
 | 
			
		||||
        sysUser.setLoginDate(DateUtils.getNowDate());
 | 
			
		||||
        sysUser.setUpdateBy(userId);
 | 
			
		||||
        userMapper.updateById(sysUser);
 | 
			
		||||
 
 | 
			
		||||
@@ -69,9 +69,6 @@ public class EmailAuthStrategy implements IAuthStrategy {
 | 
			
		||||
        // 生成token
 | 
			
		||||
        LoginHelper.login(loginUser, model);
 | 
			
		||||
 | 
			
		||||
        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
 | 
			
		||||
        loginService.recordLoginInfo(user.getUserId());
 | 
			
		||||
 | 
			
		||||
        LoginVo loginVo = new LoginVo();
 | 
			
		||||
        loginVo.setAccessToken(StpUtil.getTokenValue());
 | 
			
		||||
        loginVo.setExpireIn(StpUtil.getTokenTimeout());
 | 
			
		||||
 
 | 
			
		||||
@@ -79,9 +79,6 @@ public class PasswordAuthStrategy implements IAuthStrategy {
 | 
			
		||||
        // 生成token
 | 
			
		||||
        LoginHelper.login(loginUser, model);
 | 
			
		||||
 | 
			
		||||
        loginService.recordLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
 | 
			
		||||
        loginService.recordLoginInfo(user.getUserId());
 | 
			
		||||
 | 
			
		||||
        LoginVo loginVo = new LoginVo();
 | 
			
		||||
        loginVo.setAccessToken(StpUtil.getTokenValue());
 | 
			
		||||
        loginVo.setExpireIn(StpUtil.getTokenTimeout());
 | 
			
		||||
 
 | 
			
		||||
@@ -69,9 +69,6 @@ public class SmsAuthStrategy implements IAuthStrategy {
 | 
			
		||||
        // 生成token
 | 
			
		||||
        LoginHelper.login(loginUser, model);
 | 
			
		||||
 | 
			
		||||
        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
 | 
			
		||||
        loginService.recordLoginInfo(user.getUserId());
 | 
			
		||||
 | 
			
		||||
        LoginVo loginVo = new LoginVo();
 | 
			
		||||
        loginVo.setAccessToken(StpUtil.getTokenValue());
 | 
			
		||||
        loginVo.setExpireIn(StpUtil.getTokenTimeout());
 | 
			
		||||
 
 | 
			
		||||
@@ -12,13 +12,11 @@ import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import me.zhyd.oauth.model.AuthResponse;
 | 
			
		||||
import me.zhyd.oauth.model.AuthUser;
 | 
			
		||||
import org.dromara.common.core.constant.Constants;
 | 
			
		||||
import org.dromara.common.core.domain.model.LoginUser;
 | 
			
		||||
import org.dromara.common.core.domain.model.SocialLoginBody;
 | 
			
		||||
import org.dromara.common.core.enums.UserStatus;
 | 
			
		||||
import org.dromara.common.core.exception.ServiceException;
 | 
			
		||||
import org.dromara.common.core.exception.user.UserException;
 | 
			
		||||
import org.dromara.common.core.utils.MessageUtils;
 | 
			
		||||
import org.dromara.common.core.utils.ValidatorUtils;
 | 
			
		||||
import org.dromara.common.json.utils.JsonUtils;
 | 
			
		||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
			
		||||
@@ -106,9 +104,6 @@ public class SocialAuthStrategy implements IAuthStrategy {
 | 
			
		||||
        // 生成token
 | 
			
		||||
        LoginHelper.login(loginUser, model);
 | 
			
		||||
 | 
			
		||||
        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
 | 
			
		||||
        loginService.recordLoginInfo(user.getUserId());
 | 
			
		||||
 | 
			
		||||
        LoginVo loginVo = new LoginVo();
 | 
			
		||||
        loginVo.setAccessToken(StpUtil.getTokenValue());
 | 
			
		||||
        loginVo.setExpireIn(StpUtil.getTokenTimeout());
 | 
			
		||||
 
 | 
			
		||||
@@ -5,11 +5,9 @@ import cn.dev33.satoken.stp.StpUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.dromara.common.core.constant.Constants;
 | 
			
		||||
import org.dromara.common.core.domain.model.XcxLoginBody;
 | 
			
		||||
import org.dromara.common.core.domain.model.XcxLoginUser;
 | 
			
		||||
import org.dromara.common.core.enums.UserStatus;
 | 
			
		||||
import org.dromara.common.core.utils.MessageUtils;
 | 
			
		||||
import org.dromara.common.core.utils.ValidatorUtils;
 | 
			
		||||
import org.dromara.common.json.utils.JsonUtils;
 | 
			
		||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
			
		||||
@@ -68,9 +66,6 @@ public class XcxAuthStrategy implements IAuthStrategy {
 | 
			
		||||
        // 生成token
 | 
			
		||||
        LoginHelper.login(loginUser, model);
 | 
			
		||||
 | 
			
		||||
        loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
 | 
			
		||||
        loginService.recordLoginInfo(user.getUserId());
 | 
			
		||||
 | 
			
		||||
        LoginVo loginVo = new LoginVo();
 | 
			
		||||
        loginVo.setAccessToken(StpUtil.getTokenValue());
 | 
			
		||||
        loginVo.setExpireIn(StpUtil.getTokenTimeout());
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user