From c886f0807069f7c98580cbea076d6801de7d0388 Mon Sep 17 00:00:00 2001 From: hebo <13216192626@163.com> Date: Sat, 27 Nov 2021 22:52:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?ref:=20=E5=A4=9A=E8=B4=A6=E5=8F=B7=E4=BD=93?= =?UTF-8?q?=E7=B3=BB=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?,=20=E6=96=B9=E4=BE=BF=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysLoginController.java | 7 +- .../common/core/domain/model/LoginBody.java | 15 ++- .../java/com/ruoyi/common/enums/UserType.java | 24 ++++- .../com/ruoyi/common/utils/LoginUtils.java | 40 ++++---- .../system/listener/UserActionListener.java | 89 ++++++++++++++++++ .../ruoyi/system/service/ISaUserService.java | 53 +++++++++++ .../ruoyi/system/service/SaUserServices.java | 86 ++++++++++++++++++ .../ruoyi/system/service/SysLoginService.java | 6 +- .../service/impl/SaAppUserServiceImpl.java | 42 +++++++++ .../system/service/impl/SaInterfaceImpl.java | 54 ++++------- .../service/impl/SaSysUserServiceImpl.java | 91 +++++++++++++++++++ 11 files changed, 438 insertions(+), 69 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/listener/UserActionListener.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISaUserService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/SaUserServices.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaAppUserServiceImpl.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaSysUserServiceImpl.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index d6ea043b8..f4602b643 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -10,7 +10,7 @@ import com.ruoyi.common.core.domain.model.LoginBody; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.domain.vo.RouterVo; import com.ruoyi.system.service.ISysMenuService; -import com.ruoyi.system.service.SysLoginService; +import com.ruoyi.system.service.SaUserServices; import com.ruoyi.system.service.SysPermissionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -38,7 +38,7 @@ import java.util.Set; @RestController public class SysLoginController { - private final SysLoginService loginService; + private final SaUserServices userServices; private final ISysMenuService menuService; private final SysPermissionService permissionService; @@ -53,8 +53,7 @@ public class SysLoginController { public AjaxResult> login(@RequestBody LoginBody loginBody) { Map ajax = new HashMap<>(); // 生成令牌 - String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), - loginBody.getUuid()); + String token = userServices.login(loginBody); ajax.put(Constants.TOKEN, token); return AjaxResult.success(ajax); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java index d47053694..703caf60d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java @@ -1,10 +1,13 @@ package com.ruoyi.common.core.domain.model; +import com.ruoyi.common.enums.DeviceType; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.constraints.NotNull; + /** * 用户登录对象 * @@ -16,16 +19,24 @@ import lombok.experimental.Accessors; @ApiModel("用户登录对象") public class LoginBody { + /** + * 设备类型 + */ + @ApiModelProperty(value = "设备类型(默认pc): pc, app") + private String deviceType = DeviceType.PC.getDevice(); + /** * 用户名 */ - @ApiModelProperty(value = "用户名") + @NotNull(message = "用户名不能为空") + @ApiModelProperty(value = "用户名", required = true) private String username; /** * 用户密码 */ - @ApiModelProperty(value = "用户密码") + @NotNull(message = "用户密码不能为空") + @ApiModelProperty(value = "用户密码", required = true) private String password; /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java index 9c3b53195..c801f85c0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserType.java @@ -1,10 +1,13 @@ package com.ruoyi.common.enums; +import com.ruoyi.common.exception.ServiceException; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; + /** - * 设备类型 + * 用户类型 * 针对两套 用户体系 * * @author Lion Li @@ -16,12 +19,27 @@ public enum UserType { /** * pc端 */ - SYS_USER("sys_user:"), + SYS_USER("sys_user:", DeviceType.PC), /** * app端 */ - APP_USER("app_user:"); + APP_USER("app_user:", DeviceType.APP); + /** + * 用户类型 + */ private final String userType; + + /** + * 设备类型 + */ + private final DeviceType deviceType; + + public static UserType getByDeviceType(String deviceType) { + return Arrays.stream(UserType.values()) + .filter(type -> type.getDeviceType().getDevice().equalsIgnoreCase(deviceType)) + .findFirst() + .orElseThrow(() -> new ServiceException("设备类型不支持:" + deviceType)); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java index 9cd759f4a..057793cb9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java @@ -27,25 +27,15 @@ public class LoginUtils { * 针对一套用户体系 * @param userId 用户id */ - public static void loginByDevice(Long userId, UserType userType, DeviceType deviceType) { - StpUtil.login(userType.getUserType() + userId, deviceType.getDevice()); + public static void loginByDevice(Long userId, UserType userType, String deviceType) { + StpUtil.login(userType.getUserType() + userId, deviceType); } /** * 获取用户id */ public static Long getUserId() { - String loginId = StpUtil.getLoginIdAsString(); - String userId; - String replace = ""; - if (StringUtils.contains(loginId, UserType.SYS_USER.getUserType())) { - userId = StringUtils.replace(loginId, UserType.SYS_USER.getUserType(), replace); - } else if (StringUtils.contains(loginId, UserType.APP_USER.getUserType())){ - userId = StringUtils.replace(loginId, UserType.APP_USER.getUserType(), replace); - } else { - throw new UtilException("登录用户: LoginId异常 => " + loginId); - } - return Long.parseLong(userId); + return parseUserId(StpUtil.getLoginIdAsString()); } /** @@ -56,14 +46,26 @@ public class LoginUtils { return getUserType(loginId); } + /** + * 根据登录ID获取用户类型 + * + * @param loginId 登录ID + * @return 用户类型 + */ public static UserType getUserType(Object loginId) { - if (StringUtils.contains(loginId.toString(), UserType.SYS_USER.getUserType())) { - return UserType.SYS_USER; - } else if (StringUtils.contains(loginId.toString(), UserType.APP_USER.getUserType())){ - return UserType.APP_USER; - } else { - throw new UtilException("登录用户: LoginId异常 => " + loginId); + for (UserType userType : UserType.values()) { + if (StringUtils.startsWith(loginId.toString(), userType.getUserType())) { + return userType; + } } + throw new UtilException("登录用户: LoginId异常 => " + loginId); } + /** + * 获取用户ID + */ + public static Long parseUserId(Object loginId) { + UserType userType = getUserType(loginId); + return Long.parseLong(StringUtils.replace(loginId.toString(), userType.getUserType(), StringUtils.EMPTY)); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/UserActionListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/UserActionListener.java new file mode 100644 index 000000000..a9b45ecf6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/UserActionListener.java @@ -0,0 +1,89 @@ +package com.ruoyi.system.listener; + +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.system.service.SaUserServices; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 用户行为 侦听器的实现 + */ +@Slf4j +@Component +@RequiredArgsConstructor(onConstructor_ = @Autowired) +public class UserActionListener implements SaTokenListener { + + private final SaUserServices userServices; + + /** + * 每次登录时触发 + */ + @Override + public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) { + userServices.loginSuccess(loginType, loginId, loginModel); + log.info("user doLogin, useId:{}, token:{}", loginId, StpUtil.getTokenValue()); + } + + /** + * 每次注销时触发 + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogout, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被踢下线时触发 + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogoutByLoginId, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被顶下线时触发 + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doReplaced, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被封禁时触发 + */ + @Override + public void doDisable(String loginType, Object loginId, long disableTime) { + } + + /** + * 每次被解封时触发 + */ + @Override + public void doUntieDisable(String loginType, Object loginId) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 每次注销Session时触发 + */ + @Override + public void doLogoutSession(String id) { + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISaUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISaUserService.java new file mode 100644 index 000000000..83b4e3867 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISaUserService.java @@ -0,0 +1,53 @@ +package com.ruoyi.system.service; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpInterface; +import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.enums.UserType; + +/** + * Sa用户服务接口 + * + * @author dawn + */ +public interface ISaUserService extends StpInterface { + + /** + * 是否支持 + * + * @param userType 用户类型 + * @return 是否支持 + */ + default boolean isSupport(UserType userType) { + return getUserType().equals(userType); + } + + /** + * 获取用户类型 + * + * @return UserType + */ + UserType getUserType(); + + /** + * 用户登录 + * + * @param loginBody 登录请求体 + * @return token + */ + default String login(LoginBody loginBody) { + throw new UnsupportedOperationException("暂不支持登录, 用户类型:" + getUserType()); + } + + /** + * 登录成功后调用该接口 + * + * @param loginType 登录类型 + * @param loginId 登录ID + * @param loginModel 登录模式 + */ + default void loginSuccess(String loginType, Object loginId, SaLoginModel loginModel) { + + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SaUserServices.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SaUserServices.java new file mode 100644 index 000000000..98d5ddc7f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SaUserServices.java @@ -0,0 +1,86 @@ +package com.ruoyi.system.service; + +import cn.dev33.satoken.stp.SaLoginModel; +import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.LoginUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户服务: 支持多账号体系 + * + * @author dawn + */ +@Service +@RequiredArgsConstructor(onConstructor_ = @Autowired) +public class SaUserServices { + + /** + * 用户服务列表 + */ + private final List userServices; + + /** + * 获取用户权限列表 + * + * @param loginId 用户ID + * @param loginType 登录类型 + * @return 权限列表 + */ + public List getPermissionList(Object loginId, String loginType) { + return getUserService().getPermissionList(loginId, loginType); + } + + /** + * 获取用户角色列表 + * + * @param loginId 用户ID + * @param loginType 登录类型 + * @return 角色列表 + */ + public List getRoleList(Object loginId, String loginType) { + return getUserService().getRoleList(loginId, loginType); + } + + /** + * 用户给登录 + * + * @param loginBody 登录请求体 + * @return token + */ + public String login(LoginBody loginBody) { + UserType userType = UserType.getByDeviceType(loginBody.getDeviceType()); + return getUserService(userType).login(loginBody); + } + + /** + * 登录成功后调用该接口 + * + * @param loginType 登录类型 + * @param loginId 登录ID + * @param loginModel 登录模式 + */ + public void loginSuccess(String loginType, Object loginId, SaLoginModel loginModel) { + getUserService().loginSuccess(loginType, loginId, loginModel); + } + + private ISaUserService getUserService() { + return getUserService(LoginUtils.getUserType()); + } + + private ISaUserService getUserService(UserType userType) { + for (ISaUserService userService : userServices) { + if (userService.isSupport(userType)) { + return userService; + } + } + throw new ServiceException("用户类型不支持:" + userType); + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java index 08098ddc0..72e1c95e6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -4,7 +4,6 @@ import cn.dev33.satoken.stp.StpUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.service.LogininforService; -import com.ruoyi.common.enums.DeviceType; import com.ruoyi.common.enums.UserStatus; import com.ruoyi.common.enums.UserType; import com.ruoyi.common.exception.ServiceException; @@ -14,7 +13,6 @@ import com.ruoyi.common.exception.user.UserPasswordNotMatchException; import com.ruoyi.common.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; @@ -46,7 +44,7 @@ public class SysLoginService { * @param uuid 唯一标识 * @return 结果 */ - public String login(String username, String password, String code, String uuid) { + public String login(String username, String password, String code, String uuid, UserType userType, String deviceType) { HttpServletRequest request = ServletUtils.getRequest(); boolean captchaOnOff = configService.selectCaptchaOnOff(); // 验证码开关 @@ -72,7 +70,7 @@ public class SysLoginService { asyncService.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); recordLoginInfo(user.getUserId(), username); // 生成token - LoginUtils.loginByDevice(user.getUserId(), UserType.SYS_USER, DeviceType.PC); + LoginUtils.loginByDevice(user.getUserId(), userType, deviceType); return StpUtil.getTokenValue(); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaAppUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaAppUserServiceImpl.java new file mode 100644 index 000000000..867bcedfe --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaAppUserServiceImpl.java @@ -0,0 +1,42 @@ +package com.ruoyi.system.service.impl; + +import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.system.service.ISaUserService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * app用户服务 + * + * @author dawn + */ +@Service +public class SaAppUserServiceImpl implements ISaUserService { + + @Override + public UserType getUserType() { + return UserType.APP_USER; + } + + @Override + public List getPermissionList(Object loginId, String loginType) { + // TODO App用户权限获取 + throw new UnsupportedOperationException("暂不支持该操作, 用户类型:" + getUserType()); + } + + @Override + public List getRoleList(Object loginId, String loginType) { + // TODO App用户角色获取 + throw new UnsupportedOperationException("暂不支持该操作, 用户类型:" + getUserType()); + } + + @Override + public String login(LoginBody loginBody) { + // TODO App用户登录 + throw new UnsupportedOperationException("暂不支持该操作, 用户类型:" + getUserType()); + } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaInterfaceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaInterfaceImpl.java index 5dc66f292..1ce582ace 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaInterfaceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaInterfaceImpl.java @@ -1,51 +1,31 @@ package com.ruoyi.system.service.impl; import cn.dev33.satoken.stp.StpInterface; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.enums.UserType; -import com.ruoyi.common.utils.LoginUtils; -import com.ruoyi.system.service.ISysUserService; -import com.ruoyi.system.service.SysPermissionService; +import com.ruoyi.system.service.SaUserServices; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import java.util.ArrayList; import java.util.List; -import java.util.Set; +@Primary @Component +@RequiredArgsConstructor(onConstructor_ = @Autowired) public class SaInterfaceImpl implements StpInterface { - @Autowired - private SysPermissionService sysPermissionService; - @Autowired - private ISysUserService iSysUserService; + /** + * 用户服务 + */ + private final SaUserServices userServices; - @Override - public List getPermissionList(Object loginId, String loginType) { - UserType userType = LoginUtils.getUserType(loginId); - if (userType == UserType.SYS_USER) { - Long userId = LoginUtils.getUserId(); - SysUser user = iSysUserService.getById(userId); - Set menuPermission = sysPermissionService.getMenuPermission(user); - return new ArrayList<>(menuPermission); - } else if (userType == UserType.APP_USER) { - // app端权限返回 自行根据业务编写 - } - return new ArrayList<>(); - } + @Override + public List getPermissionList(Object loginId, String loginType) { + return userServices.getPermissionList(loginId, loginType); + } - @Override - public List getRoleList(Object loginId, String loginType) { - UserType userType = LoginUtils.getUserType(loginId); - if (userType == UserType.SYS_USER) { - Long userId = LoginUtils.getUserId(); - SysUser user = iSysUserService.getById(userId); - Set rolePermission = sysPermissionService.getRolePermission(user); - return new ArrayList<>(rolePermission); - } else if (userType == UserType.APP_USER) { - // app端权限返回 自行根据业务编写 - } - return new ArrayList<>(); - } + @Override + public List getRoleList(Object loginId, String loginType) { + return userServices.getRoleList(loginId, loginType); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaSysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaSysUserServiceImpl.java new file mode 100644 index 000000000..25c4b2f2d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SaSysUserServiceImpl.java @@ -0,0 +1,91 @@ +package com.ruoyi.system.service.impl; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.dto.UserOnlineDTO; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.utils.*; +import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.system.service.ISaUserService; +import com.ruoyi.system.service.ISysUserService; +import com.ruoyi.system.service.SysLoginService; +import com.ruoyi.system.service.SysPermissionService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * 系统用户服务 + * + * @author dawn + */ +@Slf4j +@Service +@RequiredArgsConstructor(onConstructor_ = @Autowired) +public class SaSysUserServiceImpl implements ISaUserService { + + private final ISysUserService sysUserService; + private final SysPermissionService sysPermissionService; + private final SysLoginService loginService; + private final SaTokenConfig saTokenConfig; + + @Override + public UserType getUserType() { + return UserType.SYS_USER; + } + + @Override + public List getPermissionList(Object loginId, String loginType) { + Long userId = LoginUtils.parseUserId(loginId); + SysUser user = sysUserService.getById(userId); + Set menuPermission = sysPermissionService.getMenuPermission(user); + return new ArrayList<>(menuPermission); + } + + @Override + public List getRoleList(Object loginId, String loginType) { + Long userId = LoginUtils.parseUserId(loginId); + SysUser user = sysUserService.getById(userId); + Set rolePermission = sysPermissionService.getRolePermission(user); + return new ArrayList<>(rolePermission); + } + + @Override + public String login(LoginBody loginBody) { + return loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid(), getUserType(), loginBody.getDeviceType()); + } + + @Override + public void loginSuccess(String loginType, Object loginId, SaLoginModel loginModel) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + SysUser user = SecurityUtils.getUser(); + String tokenValue = StpUtil.getTokenValue(); + UserOnlineDTO userOnlineDTO = new UserOnlineDTO() + .setIpaddr(ip) + .setLoginLocation(AddressUtils.getRealAddressByIP(ip)) + .setBrowser(userAgent.getBrowser().getName()) + .setOs(userAgent.getOs().getName()) + .setLoginTime(System.currentTimeMillis()) + .setTokenId(tokenValue) + .setUserName(user.getUserName()); + if (StringUtils.isNotNull(user.getDept())) { + userOnlineDTO.setDeptName(user.getDept().getDeptName()); + } + RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, userOnlineDTO, saTokenConfig.getTimeout(), TimeUnit.SECONDS); + } + +} From bc18c654e66f7a1c7b60429b3e71d9be976f7384 Mon Sep 17 00:00:00 2001 From: hebo <13216192626@163.com> Date: Sat, 27 Nov 2021 22:53:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?remove:=20=E7=A7=BB=E9=99=A4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A1=8C=E4=B8=BA=E7=9B=91=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/UserActionListener.java | 116 ------------------ 1 file changed, 116 deletions(-) delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java deleted file mode 100644 index 5130da977..000000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.ruoyi.framework.listener; - -import cn.dev33.satoken.config.SaTokenConfig; -import cn.dev33.satoken.listener.SaTokenListener; -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.dto.UserOnlineDTO; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.enums.UserType; -import com.ruoyi.common.utils.*; -import com.ruoyi.common.utils.ip.AddressUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.concurrent.TimeUnit; - -/** - * 用户行为 侦听器的实现 - */ -@Component -@Slf4j -public class UserActionListener implements SaTokenListener { - - @Autowired - private SaTokenConfig saTokenConfig; - - /** - * 每次登录时触发 - */ - @Override - public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) { - UserType userType = LoginUtils.getUserType(loginId); - if (userType == UserType.SYS_USER) { - UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); - String ip = ServletUtils.getClientIP(); - SysUser user = SecurityUtils.getUser(); - String tokenValue = StpUtil.getTokenValue(); - UserOnlineDTO userOnlineDTO = new UserOnlineDTO() - .setIpaddr(ip) - .setLoginLocation(AddressUtils.getRealAddressByIP(ip)) - .setBrowser(userAgent.getBrowser().getName()) - .setOs(userAgent.getOs().getName()) - .setLoginTime(System.currentTimeMillis()) - .setTokenId(tokenValue) - .setUserName(user.getUserName()); - if (StringUtils.isNotNull(user.getDept())) { - userOnlineDTO.setDeptName(user.getDept().getDeptName()); - } - RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, userOnlineDTO, saTokenConfig.getTimeout(), TimeUnit.SECONDS); - log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); - } else if (userType == UserType.APP_USER) { - // app端 自行根据业务编写 - } - } - - /** - * 每次注销时触发 - */ - @Override - public void doLogout(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); - log.info("user doLogout, useId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被踢下线时触发 - */ - @Override - public void doKickout(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); - log.info("user doLogoutByLoginId, useId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被顶下线时触发 - */ - @Override - public void doReplaced(String loginType, Object loginId, String tokenValue) { - RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); - log.info("user doReplaced, useId:{}, token:{}", loginId, tokenValue); - } - - /** - * 每次被封禁时触发 - */ - @Override - public void doDisable(String loginType, Object loginId, long disableTime) { - } - - /** - * 每次被解封时触发 - */ - @Override - public void doUntieDisable(String loginType, Object loginId) { - } - - /** - * 每次创建Session时触发 - */ - @Override - public void doCreateSession(String id) { - } - - /** - * 每次注销Session时触发 - */ - @Override - public void doLogoutSession(String id) { - } - - -}