若依(RuoYi)管理系统取消登录验证完整指南

若依(RuoYi)管理系统取消登录验证完整指南

一、需求背景

在项目部署或演示场景下,有时需要关闭若依管理系统的登录验证功能,让所有用户可以直接访问系统首页,无需输入用户名和密码。

本文记录了完整的实现过程,包括后端配置修改、前端路由调整,以及过程中遇到的各种问题的解决方案。


二、整体方案

采用完全关闭登录验证的方案,涉及以下四个层面:

层面 修改内容
后端 URL 级别 Spring Security 放行所有请求
后端方法级别 关闭 @PreAuthorize 注解拦截
后端接口兼容 getInfo / getRouters 接口兼容无登录状态访问
前端路由守卫 移除 Token 检查逻辑
前端请求拦截 静默处理 401 响应,不弹框

三、实施步骤

3.1 后端:关闭 URL 级别权限控制

文件ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

修改内容 :将 authorizeHttpRequests 中的配置改为全部放行

java 复制代码
// 关键配置:所有请求放行
authorizeHttpRequests(exchanges -> exchanges
    .anyRequest().permitAll()
)

同时注释掉 sessionCreationPolicy 中的 STATELESS 配置(可选,取决于是否需要 Session)。


3.2 后端:关闭方法级别权限控制

文件ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

修改内容 :注释 @EnableMethodSecurity 注解

java 复制代码
// 注释此行,关闭方法级权限检查
// @EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Configuration
public class SecurityConfig {
    // ...
}

说明 :即使 URL 级别已放行,若 @EnableMethodSecurity 仍然启用,所有带 @PreAuthorize 注解的 Controller 方法仍会被拦截,导致业务接口返回"认证失败,无法访问系统资源"。


3.3 后端:兼容无登录状态的接口

文件ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

3.3.1 getInfo 接口修改
java 复制代码
@GetMapping("getInfo")
public AjaxResult getInfo()
{
    try
    {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysUser user = loginUser.getUser();
        Set<String> roles = permissionService.getRolePermission(user);
        Set<String> permissions = permissionService.getMenuPermission(user);
        if (!loginUser.getPermissions().equals(permissions))
        {
            loginUser.setPermissions(permissions);
            tokenService.refreshToken(loginUser);
        }
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        ajax.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate()));
        ajax.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate()));
        return ajax;
    }
    catch (Exception e)
    {
        // 未登录时返回默认 admin 用户(ID=1)
        log.info("getInfo: 未检测到登录用户,返回默认admin用户信息");
        SysUser user = userService.selectUserById(1L);
        if (user == null)
        {
            return AjaxResult.error("系统未初始化,请先执行数据库初始化");
        }
        Set<String> roles = permissionService.getRolePermission(user);
        Set<String> permissions = permissionService.getMenuPermission(user);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        ajax.put("isDefaultModifyPwd", false);
        ajax.put("isPasswordExpired", false);
        return ajax;
    }
}
3.3.2 getRouters 接口修改
java 复制代码
@GetMapping("getRouters")
public AjaxResult getRouters()
{
    try
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
        return AjaxResult.success(menuService.buildMenus(menus));
    }
    catch (Exception e)
    {
        // 未登录时使用默认 admin 用户 ID=1
        log.info("getRouters: 未检测到登录用户,使用默认admin路由");
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(1L);
        return AjaxResult.success(menuService.buildMenus(menus));
    }
}

说明 :需要注入 ISysUserService

java 复制代码
@Autowired
private ISysUserService userService;

3.4 前端:修改路由守卫

文件ruoyi-ui/src/permission.js

修改内容:移除 Token 检查,直接获取用户信息

javascript 复制代码
router.beforeEach((to, from, next) => {
  NProgress.start()
  to.meta.title && store.dispatch('settings/setTitle', to.meta.title)

  // 访问登录页直接跳转到首页
  if (to.path === '/login') {
    next({ path: '/' })
    NProgress.done()
    return
  }

  if (isWhiteList(to.path)) {
    next()
    return
  }

  // 无需 token,直接获取用户角色信息
  if (store.getters.roles.length === 0) {
    isRelogin.show = true
    store.dispatch('GetInfo').then(() => {
      store.dispatch('GenerateRoutes').then(accessRoutes => {
        isRelogin.show = false
        router.addRoutes(accessRoutes)
        next({ ...to, replace: true })
      }).catch(() => {
        isRelogin.show = false
        next()
      })
    }).catch(() => {
      // GetInfo 失败时使用默认 admin 用户
      store.commit('SET_ROLES', ['admin'])
      store.commit('SET_PERMISSIONS', ['*:*:*'])
      store.commit('SET_ID', 1)
      store.commit('SET_NAME', 'admin')
      store.commit('SET_NICK_NAME', '管理员')
      store.dispatch('GenerateRoutes').then(accessRoutes => {
        isRelogin.show = false
        router.addRoutes(accessRoutes)
        next({ ...to, replace: true })
      }).catch(() => {
        isRelogin.show = false
        next()
      })
    })
  } else {
    next()
  }
})

3.5 前端:自动设置默认 Token

文件ruoyi-ui/src/utils/auth.js

修改内容:无 Token 时自动设置默认值

javascript 复制代码
import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

export function getToken() {
  // 无 token 时返回默认值,跳过登录验证
  let token = Cookies.get(TokenKey)
  if (!token) {
    token = 'admin-token-default'
    Cookies.set(TokenKey, token)
  }
  return token
}

3.6 前端:静默处理 401 响应

文件ruoyi-ui/src/utils/request.js

修改内容:移除 401 响应的弹框提示

javascript 复制代码
if (code === 401) {
  // 已关闭登录验证,静默处理 401,不弹框不重定向
  return Promise.reject(new Error(msg))
}

四、问题排查记录

问题 1:访问首页仍然跳转登录页

原因 :后端已放行,但前端 permission.js 仍在检查 Token,无 Token 时强制跳转 /login

解决 :修改 permission.js,移除 Token 检查逻辑。


问题 2:提示"无效的会话,或者会话已过期,请重新登录"

原因 :后端 getInfo 接口调用 SecurityUtils.getLoginUser() 时,无登录用户抛异常返回 401;前端 request.js 拦截 401 后弹框提示。

解决

  • 后端:getInfogetRouters 增加 try-catch,无登录状态时返回默认 admin 数据
  • 前端:request.js 中 401 处理逻辑改为静默处理

问题 3:提示"登录状态已过期,您可以继续留在该页面,或者重新登录"

原因request.js 的 401 拦截器中有 MessageBox.confirm 弹框逻辑,即使后端已修改,若后端未重启仍会触发。

解决:彻底移除 401 响应的弹框逻辑。


问题 4:业务接口提示"认证失败,无法访问系统资源"

原因@EnableMethodSecurity 启用了方法级权限检查,URL 放行但 @PreAuthorize 注解仍在拦截。

解决 :注释 @EnableMethodSecurity 注解。


五、修改文件清单

序号 文件路径 修改类型
1 ruoyi-framework/.../SecurityConfig.java 放行所有请求 + 关闭方法级权限
2 ruoyi-admin/.../SysLoginController.java getInfo/getRouters 兼容无登录状态
3 ruoyi-ui/src/permission.js 移除 Token 检查
4 ruoyi-ui/src/utils/auth.js 自动设置默认 Token
5 ruoyi-ui/src/utils/request.js 静默处理 401

六、重启服务

所有修改完成后,需要同时重启前后端

powershell 复制代码
# 后端重启(在 IDE 中重新运行 RuoYiApplication 或执行)
cd c:\workspace\gitee\side_job\sjrd\yingyan
mvn clean package -DskipTests

# 前端重启
cd c:\workspace\gitee\side_job\sjrd\yingyan\ruoyi-ui
npm run dev

七、注意事项

  1. 此方案仅适用于演示/内部环境,生产环境请勿使用
  2. 关闭登录验证后,所有接口对外暴露,需注意数据安全
  3. 若后续需要恢复登录功能,需回滚所有修改
  4. 确保数据库中存有 admin 用户(ID=1),否则 getInfo 降级逻辑会报错

以上为完整的取消登录验证实施文档,所有修改均已在实际环境中验证通过。