В Ruby on Rails Restful Authentication почему current_user проверяет имя пользователя и пароль HTTP? - PullRequest
2 голосов
/ 24 февраля 2011

В спокойной аутентификации, lib/authenticated_system.rb, почему current_user делает login_from_basic_auth, что делает authenticate_with_http_basic, который проверяет предоставленные пользователем HTTP имя пользователя и пароль?

Я думал, что форма входа в систему /session/new (или /login), а затем она POST к /session, которая перейдет к контроллеру sessions, действию 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

Итак, вопрос в том, если имя пользователя и пароль были ранее проверены, то зачем проверять их в current_user?

1 Ответ

3 голосов
/ 25 февраля 2011

Эта функция указывает, что в вашей системе есть три способа аутентификации:

  1. Использование запроса POST из / session / new или /login.
  2. Использование BASIC HTTP-аутентификации (всплывающее окно или URL-адрес, предоставленные имя пользователя и пароль).
  3. Использование cookie-файла Запомнить меня, чтобы сеансы могли сохраняться, даже если cookie-файлы сеанса уничтожены или браузер перезапущен.

Даже если вашбазовый вход в систему происходит с запросом POST от / session / new или / login, единственное, что фактически делает запрос POST, это установить идентификатор пользователя сеанса (вероятно, session [: user_id]).После того, как этот сеанс [: user_id] был установлен, вам больше не нужно входить в систему для выполнения запроса, потому что вы аутентифицированы.С этого момента настоящая аутентификация происходит путем проверки сеанса [: user_id], чтобы увидеть, не вошел ли кто-то в систему.

Вот более подробный жизненный цикл аутентификации (для входа в систему):

  1. Пользователь посещает /login.
  2. Пользователь вводит пароль и имя пользователя и отправляет форму.
  3. Пароль проверяется, если аутентифицирован сеанс [: user_id].
  4. Пользовательзаходит на другую страницу.
  5. Чтобы проверить, аутентифицирован ли пользователь, вызывается current_user.
  6. вызывается login_from_session и возвращается пользователь, соответствующий сеансу [: user_id].
  7. Пользователь считается аутентифицированным.

Вот более подробный жизненный цикл аутентификации (для аутентификации HTTP BASIC):

  1. Пользователь посещает http://username:password@www.example.com.
  2. Чтобы проверить, прошел ли пользователь аутентификацию, вызывается current_user.
  3. login_from_session вызывается, но session [: user_id] равен nil, поэтому возвращается nil.
  4. login_from_basic_auth isВызов и имя пользователя: пароль присутствует, поэтому соответствующий пользователь возвращается.
  5. Пользователь считается аутентифицированным.

Вот более подробный жизненный цикл аутентификации (помните, cookie):

  1. Пользователь ранее вошел в систему и выбрал опцию «запомнить меня».
  2. Пользователь закрывает свой браузер, а затем повторно открывает его и посещает ваш сайт.
  3. login_from_session вызывается, но session [: user_id] равен nil, поэтому возвращается nil.
  4. login_from_basic_auth вызывается, но отсутствуют имя пользователя и пароль, поэтому возвращается nil.
  5. login_from_cookie isВызов и файл cookie найден и используется для возврата пользователя.
  6. Пользователь считается аутентифицированным.
...