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

若依(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中的配置改为全部放行

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

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


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

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

修改内容:注释@EnableMethodSecurity注解

// 注释此行,关闭方法级权限检查// @EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)@ConfigurationpublicclassSecurityConfig{// ...}

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


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

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

3.3.1getInfo接口修改
@GetMapping("getInfo")publicAjaxResultgetInfo(){try{LoginUserloginUser=SecurityUtils.getLoginUser();SysUseruser=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);}AjaxResultajax=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()));returnajax;}catch(Exceptione){// 未登录时返回默认 admin 用户(ID=1)log.info("getInfo: 未检测到登录用户,返回默认admin用户信息");SysUseruser=userService.selectUserById(1L);if(user==null){returnAjaxResult.error("系统未初始化,请先执行数据库初始化");}Set<String>roles=permissionService.getRolePermission(user);Set<String>permissions=permissionService.getMenuPermission(user);AjaxResultajax=AjaxResult.success();ajax.put("user",user);ajax.put("roles",roles);ajax.put("permissions",permissions);ajax.put("isDefaultModifyPwd",false);ajax.put("isPasswordExpired",false);returnajax;}}
3.3.2getRouters接口修改
@GetMapping("getRouters")publicAjaxResultgetRouters(){try{LonguserId=SecurityUtils.getUserId();List<SysMenu>menus=menuService.selectMenuTreeByUserId(userId);returnAjaxResult.success(menuService.buildMenus(menus));}catch(Exceptione){// 未登录时使用默认 admin 用户 ID=1log.info("getRouters: 未检测到登录用户,使用默认admin路由");List<SysMenu>menus=menuService.selectMenuTreeByUserId(1L);returnAjaxResult.success(menuService.buildMenus(menus));}}

说明:需要注入ISysUserService

@AutowiredprivateISysUserServiceuserService;

3.4 前端:修改路由守卫

文件ruoyi-ui/src/permission.js

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

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=truestore.dispatch('GetInfo').then(()=>{store.dispatch('GenerateRoutes').then(accessRoutes=>{isRelogin.show=falserouter.addRoutes(accessRoutes)next({...to,replace:true})}).catch(()=>{isRelogin.show=falsenext()})}).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=falserouter.addRoutes(accessRoutes)next({...to,replace:true})}).catch(()=>{isRelogin.show=falsenext()})})}else{next()}})

3.5 前端:自动设置默认 Token

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

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

importCookiesfrom'js-cookie'constTokenKey='Admin-Token'exportfunctiongetToken(){// 无 token 时返回默认值,跳过登录验证lettoken=Cookies.get(TokenKey)if(!token){token='admin-token-default'Cookies.set(TokenKey,token)}returntoken}

3.6 前端:静默处理 401 响应

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

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

if(code===401){// 已关闭登录验证,静默处理 401,不弹框不重定向returnPromise.reject(newError(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注解。


五、修改文件清单

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

六、重启服务

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

# 后端重启(在 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降级逻辑会报错

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