我们有一个处理用户身份验证的外部系统。我们正在缓慢但肯定地从该系统切换到轨道。
在此阶段,使用第三方宝石不是我们的选择。长话短说,我们需要围绕“约会”创建授权。
基本上,只有“拥有”约会的用户才能修改它们。
我将此方法添加到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 }
我知道这可能不是最好的方法,并且当我说我们将尽快迁移到可扩展的东西时,相信我。但就目前而言,上述方法是否恰当?你有什么建议吗?
答案 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可以帮助您实现目标。