若依(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 后弹框提示。
解决:
- 后端:
getInfo和getRouters增加 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
七、注意事项
- 此方案仅适用于演示/内部环境,生产环境请勿使用
- 关闭登录验证后,所有接口对外暴露,需注意数据安全
- 若后续需要恢复登录功能,需回滚所有修改
- 确保数据库中存有 admin 用户(ID=1),否则
getInfo降级逻辑会报错
以上为完整的取消登录验证实施文档,所有修改均已在实际环境中验证通过。