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 可以帮助您实现目标。
我们有一个处理用户身份验证的外部系统。我们正在从那个系统切换到 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 可以帮助您实现目标。