rails 中没有第三方 gem 的用户授权

User authorization in rails without a 3rd party gem

我们有一个处理用户身份验证的外部系统。我们正在从那个系统切换到 rails,缓慢但稳步。

使用第三方 gem 现阶段不适合我们。长话短说,我们需要围绕 "appointments" 创建授权。

基本上,只有 "own" 约会的用户才能修改它们。

我将此方法添加到 ApplicationController

  def require_authorized_user!(params)
    if params[:appointment_id]
      appointment = Appointment.find(params[:appointment_id])
      if appointment.user_id.to_s != user_id.to_s
        render :file => "public/401.html", :status => :unauthorized, :layout => "application"
      end
    end
  end

AppointmentController有一个before_filter { require_authorized_user! params }

我知道这可能不是最好的方法,相信我,当我说我们将尽快迁移到可扩展的东西时。但就目前而言,上述方法是否合适?你有什么建议吗?

有点取决于 user_id 的来源,不是吗?但是,是的,如果 user_id 已在其他地方成功通过身份验证,那么您所拥有的就可以了。

假设 user 是您的用户对象并且关联设置正确,您也可以通过这种方式进行调整。

if params[:appointment_id]
  appointment = user.appointments.find_by(id: params[:appointment_id])
  if appointment.nil?
    render :file => "public/401.html", :status => :unauthorized, :layout => "application"
  end
end

如果您没有使用任何 Gem,那么 require_authorized_user! 方法从何而来?估计是你自己写的吧?

但是,是的,require_authorized_user!在前置过滤器中调用的一种方法是实现受保护操作的正确方法。

对不对,要看方法的实现。看起来你正在将 params 传递给方法,它会根据这些来决定吗?

那是不对的。因为 params 来自 URL 查询参数,或 HTTP POST 参数,在任何一种情况下,浏览器都可以将它们设置为他们想要的任何值。如果您只是检查 params[:user_id],其他人需要做的就是将 &user_id=1 添加到他们的 URL 中,他们可以成为任何他们想要的人。所以,不,这可能不好。

可以在这个免费 RailsCast: http://railscasts.com/episodes/250-authentication-from-scratch?view=asciicast

中找到关于实施您自己的身份验证的有点过时但仍然非常好的指南

在这方面有更多的想法,但仍然有些过时: http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=asciicast

我不确定是否有人有高质量的 "build your own authentication" 教程,其中包含 Rails 4 中的一些新功能,使这更容易。但是那些旧 RailsCasts 中描述的基本方法仍然有效。

很难自己建立一个没有任何漏洞的认证,有很多地方会出错。另一方面,我也不喜欢 Devise 过于复杂。有一些比 Devise 更简单的替代方法,但我自己还没有尝试过其中的任何一个。但如果你真的想完全自己构建它,你可以——但你必须知道你在做什么,否则它根本就不安全。希望那些 RailsCasts 可以帮助您实现目标。