ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuthFallbackFactory.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.system.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.feignClient.AuthClient; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; @Component public class AuthFallbackFactory implements FallbackFactory<AuthClient> { @Override public AuthClient create(Throwable cause) { return new AuthClient() { @Override public R<?> logout(String token, String source) { return R.fail("强制下线失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuthClient.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.system.api.feignClient; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.factory.AuthFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestParam; /** * @author mitao * @date 2024/7/16 */ @FeignClient(contextId = "authClient", value = ServiceNameConstants.AUTH_SERVICE, fallbackFactory = AuthFallbackFactory.class) public interface AuthClient { @GetMapping("/inner/logout") R<?> logout(@RequestParam("token") String token, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -12,6 +12,7 @@ import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.auth.AuthUtil; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; @@ -130,6 +131,19 @@ return R.ok(); } @InnerAuth @GetMapping("/inner/logout") @ApiOperation(value = "设置用户token失效") public R<?> logout(@RequestParam("") String token) { if (StringUtils.isNotEmpty(token)) { String username = JwtUtils.getUserName(token); // 删除用户缓存记录 AuthUtil.logoutByToken(token); // 记录用户退出日志 sysLoginService.logout(username); } return R.ok(); } @PostMapping("refresh") @ApiOperation(value = "管理后台-刷新令牌有效期") public R<?> refresh(HttpServletRequest request) ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java
@@ -31,6 +31,10 @@ * 权限缓存前缀 */ public final static String LOGIN_TOKEN_KEY = "login_tokens:"; /** * 用户token key */ public final static String USER_TOKEN_KEY = "user_token_key:"; /** * 验证码 redis key ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java
@@ -4,6 +4,7 @@ import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.cache.annotation.CachingConfigurerSupport; @@ -25,6 +26,10 @@ @AutoConfigureBefore(RedisAutoConfiguration.class) public class RedisConfig extends CachingConfigurerSupport { @Value("${spring.profiles.active:dev}") private String env; @Bean @SuppressWarnings(value = { "unchecked", "rawtypes" }) public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) @@ -61,7 +66,14 @@ // 集群模式 // config.useClusterServers().addNodeAddress("192.168.110.188:7004", "192.168.110.188:7001"); // 2.根据 Config 创建出 RedissonClient 示例。 config.useSingleServer().setAddress("redis://192.168.110.188:6379").setPassword("123456"); // 根据当前环境设置address if (env.equals("dev")) { config.useSingleServer().setAddress("redis://192.168.110.188:6379") .setPassword("123456"); } else if (env.equals("prod")) { config.useSingleServer().setAddress("redis://127.0.0.1:6379") .setPassword("DZaDDhN6tp"); } return Redisson.create(config); } ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -1,15 +1,7 @@ package com.ruoyi.common.security.service; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.system.api.domain.AppMiniLoginVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.ServletUtils; @@ -18,7 +10,14 @@ import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.AppMiniLoginVO; import com.ruoyi.system.api.model.LoginUser; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * token验证处理 @@ -39,6 +38,8 @@ private final static long EXPIRE_TIME = CacheConstants.EXPIRATION; private final static String ACCESS_TOKEN = CacheConstants.LOGIN_TOKEN_KEY; private final static String USER_TOKEN_KEY = CacheConstants.USER_TOKEN_KEY; private final static Long MILLIS_MINUTE_TEN = CacheConstants.REFRESH_TIME * MILLIS_MINUTE; @@ -64,8 +65,12 @@ // 接口返回信息 Map<String, Object> rspMap = new HashMap<String, Object>(); rspMap.put("access_token", JwtUtils.createToken(claimsMap)); String accessToken = JwtUtils.createToken(claimsMap); rspMap.put("access_token", accessToken); rspMap.put("expires_in", EXPIRE_TIME); String userTokenKey = getUserTokenKey(loginUser.getUserid()); redisService.setCacheObject(userTokenKey, accessToken, EXPIRE_TIME, TimeUnit.MINUTES); return rspMap; } @@ -200,6 +205,7 @@ { String userkey = JwtUtils.getUserKey(token); redisService.deleteObject(getTokenKey(userkey)); redisService.deleteObject(getUserTokenKey(Long.valueOf(JwtUtils.getUserId(token)))); } } @@ -236,4 +242,8 @@ { return ACCESS_TOKEN + token; } private String getUserTokenKey(Long userId) { return USER_TOKEN_KEY + userId; } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
@@ -128,7 +128,7 @@ SysRole role = new SysRole(); role.setRoleName(dto.getRoleName()); long count = roleService.count(Wrappers.lambdaQuery(SysRole.class) .eq(SysRole::getRoleName, dto.getRoleName())); .eq(SysRole::getRoleName, dto.getRoleName()).eq(SysRole::getDelFlag, "0")); if(count>0){ return AjaxResult.error("角色已存在,请重新输入"); } @@ -247,7 +247,9 @@ { SysRole role = new SysRole(); role.setRoleName(dto.getRoleName()); SysRole one = roleService.getOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleId, dto.getRoleId())); SysRole one = roleService.getOne( new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleId, dto.getRoleId()) .eq(SysRole::getDelFlag, "0")); List<SysRole> sysRoles = roleService.isExitUpdate(dto.getRoleName(), dto.getRoleId()); if(sysRoles.size()>0){ return AjaxResult.error("角色已存在,请重新输入"); @@ -260,20 +262,8 @@ ArrayList<SysRoleMenu> sysRoleMenus = new ArrayList<>(); List<Long> menuIds = dto.getMenuIds(); // 移除原来的权限菜单 if(menuIds.contains(1061L)){ sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>() .eq(SysRoleMenu::getRoleId,dto.getRoleId())); }else { sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>() .eq(SysRoleMenu::getRoleId,dto.getRoleId()) .ne(SysRoleMenu::getMenuId,1061L) .ne(SysRoleMenu::getMenuId,1062L) .ne(SysRoleMenu::getMenuId,1065L) .ne(SysRoleMenu::getMenuId,1073L) .ne(SysRoleMenu::getMenuId,1161L) .ne(SysRoleMenu::getMenuId,1203L) ); } sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>() .eq(SysRoleMenu::getRoleId, dto.getRoleId())); for (Long menuId : menuIds) { SysRoleMenu sysRoleMenu = new SysRoleMenu(); sysRoleMenu.setMenuId(menuId); ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; @@ -13,12 +15,14 @@ import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysDept; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.AuthClient; import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.validate.InsertGroup; import com.ruoyi.system.api.validate.UpdateGroup; @@ -94,6 +98,10 @@ @Autowired private ISysUserRoleService sysUserRoleService; @Autowired private AuthClient authClient; @Autowired private RedisService redisService; /** * 获取用户列表 */ @@ -116,7 +124,7 @@ public AjaxResult add(@Validated(InsertGroup.class) @RequestBody SysUserDTO dto) { SysUser user = BeanUtils.copyBean(dto, SysUser.class); user.setUserId(null); user.setUserType(dto.getIsAuctioneer() == 1 ? "00" : "04"); user.setUserType(dto.getIsAuctioneer() == 1 ? "00" : "01"); user.setUserName(user.getPhonenumber()); if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){ user.setNickName(user.getPhonenumber()); @@ -195,6 +203,7 @@ if (user.getPhonenumber() != null) { user.setUserName(user.getPhonenumber()); } user.setUserType(dto.getIsAuctioneer() == 1 ? "00" : "01"); user.setPassword(null); user.setUpdateBy(SecurityUtils.getUsername()); user.setUpdateTime(new Date()); @@ -225,12 +234,18 @@ SysUser sysUser = userService.selectUserById(userId); if (sysUser.getStatus().equals("0")) { sysUser.setStatus("1"); Object tokenObj = redisService.getCacheObject(getUserTokenKey(userId)); authClient.logout(tokenObj.toString(), SecurityConstants.INNER); } else { sysUser.setStatus("0"); } return toAjax(userService.updateUser(sysUser)); } private String getUserTokenKey(Long userId) { return CacheConstants.USER_TOKEN_KEY + userId; } @Autowired private ISysUserRoleService iSysUserRoleService; @@ -368,7 +383,6 @@ /** * 重置密码 */ @RequiresPermissions("system:user:edit") @ApiOperation("重置密码") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PostMapping("/resetPwd") ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.ruoyi.common.core.constant.UserConstants; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.SpringUtils; @@ -296,20 +297,7 @@ // 新增用户与角色管理 List<SysRoleMenu> list = new ArrayList<SysRoleMenu>(); Long[] menuIds = role.getMenuIds(); // List<Long> longs = Arrays.asList(menuIds); List<Long> longs = new ArrayList<>(); for (Long menuId : menuIds) { longs.add(menuId); } if(!longs.contains(1061L)){ longs.add(1061L); longs.add(1062L); longs.add(1065L); longs.add(1073L); longs.add(1161L); longs.add(1203L); } List<Long> longs = Lists.newArrayList(menuIds); for (Long menuId : longs) { SysRoleMenu rm = new SysRoleMenu();