Rails如何修改before_action允许mystuff资源所有动作跳过登录校验
Rails 5.x 全局放行mystuff路由登录校验的正确方案
方案1:单独在对应控制器跳过校验(更推荐,耦合度最低)
直接在mystuff对应的控制器中跳过全局登录校验即可,不需要修改ApplicationController的原有逻辑:
class MystuffController < ApplicationController # Rails 5+ 加raise: false避免父控制器不存在该before_action时报错 skip_before_action :check_login, raise: false # 原有业务逻辑不变 end
方案2:统一在ApplicationController中配置放行规则
如果需要把所有放行规则统一维护在父控制器,可以修改原有before_action的判断逻辑:
# 将原来的before_action替换为带条件的写法 before_action :check_login, unless: :skip_login_check? private def skip_login_check? # 原有放行的登录、认证动作 + mystuff控制器的所有动作 %w[login auth].include?(action_name) || controller_name == "mystuff" end
原有代码问题说明
- 逻辑错误:你尝试的写法中
mystuff_path || login_path || auth_path条件永远为真,因为这些路由辅助方法返回的都是非空字符串,Ruby中非nil、非false的值都是真值,相当于所有请求都跳过了登录校验,完全破坏了原有校验逻辑,除了mystuff和登录页之外其他需要鉴权的页面也会被未登录用户访问,存在严重安全风险。 ActionController::InvalidAuthenticityToken错误和本次登录校验修改无直接关联,大概率是你修改代码时误操作跳过了全局CSRF校验,或者mystuff页面的非GET请求未携带正确的CSRF令牌。使用上述两种正确方案后如果仍然报错,可以检查MystuffController中是否存在skip_forgery_protection配置,或者前端请求头是否携带了X-CSRF-Token。
内容的提问来源于stack exchange,提问作者Kryvir Myby
相关产品推荐
相关产品推荐

