mitao
2024-07-17 53155df41c5cce8f7be814a25148efe9a7ea25c5
修改bug
7个文件已修改
2个文件已添加
160 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuthFallbackFactory.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuthClient.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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();