Rails双基础控制器通用Before Action权限校验及用户上下文方案咨询
解决方案:用Rails Concern复用权限校验逻辑
这问题我熟,Rails里处理这种跨控制器复用逻辑的最佳实践就是用Concerns,完美解决你的代码重复问题,还能轻松拿到当前用户上下文。给你一步步来:
1. 创建权限校验的Concern
在app/controllers/concerns/目录下新建一个文件,比如authorization_concern.rb,把公共的权限校验逻辑都塞进去:
module AuthorizationConcern extend ActiveSupport::Concern included do # 这里添加你需要的前置校验动作,比如先验证用户登录,再检查资源权限 before_action :authenticate_user! before_action :validate_resource_permissions end private # 自定义权限检查方法,直接用current_user就行——模块被include到控制器后,能直接访问控制器的实例方法 def validate_resource_permissions # 这里替换成你的实际权限判断逻辑,比如检查用户是否有权限操作当前资源 unless current_user.allowed_to?(controller_name, action_name) render json: { error: "权限不足" }, status: :forbidden end end end
2. 在两个基础控制器里引入这个Concern
不管是BaseResourceController还是你的Application API基础控制器,只要一行代码就能复用所有逻辑:
class BaseResourceController < ActionController::API include AuthorizationConcern # 你的其他控制器逻辑... end # 假设你的另一个API基础控制器叫BaseApiController class BaseApiController < ActionController::API include AuthorizationConcern # 你的其他控制器逻辑... end
额外优化:支持定制化权限逻辑
如果两个控制器的权限规则有细微差异,你可以在Concern里留个可重写的钩子方法,兼顾复用性和灵活性:
module AuthorizationConcern extend ActiveSupport::Concern included do before_action :authenticate_user! before_action :validate_permissions end private def validate_permissions unless current_user.has_access_to?(target_resource) render json: { error: "权限不足" }, status: :forbidden end end # 默认逻辑:用控制器名作为资源标识,允许控制器重写此方法 def target_resource controller_name.singularize end end
比如某个控制器需要特殊的资源标识,直接重写target_resource就行:
class BaseResourceController < ActionController::API include AuthorizationConcern private def target_resource # 自定义资源类型,适配特殊权限规则 "custom_api_resource" end end
另外要注意:确保你的控制器已经实现了current_user方法(不管是基于session、JWT还是其他认证方式),这样权限校验才能拿到用户上下文。
内容的提问来源于stack exchange,提问作者Ashwini
相关产品推荐
相关产品推荐

