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

时间:2015-03-19 18:51:40

标签: ruby-on-rails ruby authorization

我们有一个处理用户身份验证的外部系统。我们正在缓慢但肯定地从该系统切换到轨道。

在此阶段,使用第三方宝石不是我们的选择。长话短说,我们需要围绕“约会”创建授权。

基本上,只有“拥有”约会的用户才能修改它们。

我将此方法添加到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

AppointmentControllerbefore_filter { require_authorized_user! params }

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

2 个答案:

答案 0 :(得分:1)

有点取决于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

答案 1 :(得分:0)

如果你没有使用任何宝石,那么require_authorized_user!方法来自哪里?我猜你是自己写的吗?

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

是否正确取决于方法的实施。看起来您正在将params传递给方法,它会根据这些来决定吗?

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

在这个免费的RailsCast中可以找到一个有点过时但仍然很好的实施自己的身份验证的指南:http://railscasts.com/episodes/250-authentication-from-scratch?view=asciicast

在这一个中有更多的想法,也有点过时了: http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=asciicast

我不确定是否有人有高质量的#34;建立自己的身份验证"包含Rails 4中的一些新功能的教程,使这更加容易。但是那些旧的RailsCasts中描述的基本方法仍然有效。

很难自己构建身份验证,根本没有任何漏洞,有很多地方可以犯错误。另一方面,我也不是Devise过于复杂的忠实粉丝。 Devise有一些替代方案更简单,但我还没有尝试过任何一种方法。但如果你真的想自己完全建立它,你可以 - 但你必须知道你正在做什么,或者它根本不会安全。希望那些RailsCasts可以帮助您实现目标。