在Ruby on Rails Restful Authentication中,为什么current_user会检查HTTP用户名和密码?

时间:2011-02-24 20:14:13

标签: ruby-on-rails restful-authentication

在Restful Authentication中,lib/authenticated_system.rbcurrent_user为什么要login_from_basic_auth执行authenticate_with_http_basic,检查HTTP用户提供的登录名和密码?

我认为登录表单位于/session/new(或/login),然后POST到/session,这将转到sessions控制器,{{1动作,在那里,它 验证用户提供的登录名和密码。

这是create

的第8行
lib/authenticated_system.rb

所以问题是,如果以前验证过登录名和密码,那么为什么要在def current_<%= file_name %> @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false end 中查看?

1 个答案:

答案 0 :(得分:3)

此功能表示您的系统有三种验证方式:

  1. 使用来自/ session / new或/ login的POST请求。
  2. 使用BASIC HTTP身份验证(弹出窗口或URL提供的用户名和密码)。
  3. 使用记住我的cookie,即使会话cookie被销毁或浏览器重新启动,会话也可以持续存在。
  4. 即使您的基本登录发生在来自/ session / new或/ login的POST请求中,POST请求实际执行的唯一操作就是设置会话用户ID(可能是session [:user_id])。一旦设置了会话[:user_id],您就不再需要登录才能执行请求,因为您已通过身份验证。从这一点开始,通过检查会话[:user_id]以查看某人是否已登录来进行实际身份验证。

    以下是更详细的身份验证生命周期(用于登录):

    1. 用户访问/登录。
    2. 用户输入密码和用户名并提交表单。
    3. 密码已选中,如果已通过身份验证,则会设置会话[:user_id]。
    4. 用户访问另一页。
    5. 要检查用户是否已通过身份验证,请调用current_user。
    6. 调用login_from_session并返回与session [:user_id]对应的用户。
    7. 用户被视为已通过身份验证。
    8. 这是一个更详细的身份验证生命周期(用于HTTP BASIC身份验证):

      1. 用户访问http://username:password@www.example.com
      2. 要检查用户是否已通过身份验证,请调用current_user。
      3. 调用login_from_session,但会话[:user_id]为nil,因此返回nil。
      4. 调用login_from_basic_auth,并且存在用户名:密码,因此返回相应的用户。
      5. 用户被视为已通过身份验证。
      6. 这是一个更详细的身份验证生命周期(记住我的cookie):

        1. 用户之前已登录并选择了“记住我”选项。
        2. 用户关闭浏览器,然后重新打开并访问您的网站。
        3. 调用login_from_session,但会话[:user_id]为nil,因此返回nil。
        4. 调用login_from_basic_auth,但缺少用户名和密码,因此返回nil。
        5. 调用login_from_cookie并找到cookie并用于返回用户。
        6. 用户被视为已通过身份验证。