Подход Виталия выглядит как хорошее решение, но имеет серьезную ошибку, которая предоставляет доступ администратора всем, кто пытается войти, даже если их учетные данные неверны.(Публикация этого ответа в надежде, что за него проголосуют, и люди не будут слепо принимать «правильный» ответ с его недостатком безопасности)
Сначала пара функциональных тестов (для действий, требующих аутентификации):
test "admin is set with correct credentials" do
@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("user", "pass")
get :index
assert_response 200
assert_equal true, session[:admin]
end
test "admin isn't set with incorrect credentials" do
@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("user", "incorrect")
get :index
assert_response 401
assert_not_equal true, session[:admin]
end
Если вы запустите это с кодом Виталия, второй тест не пройден, потому что session[:admin]
устанавливается в значение true, даже если пароль неправильный.
Вот мой код для правильной установки session[:admin]
и пройдите оба теста:
private
def authenticate
authenticate_or_request_with_http_basic do |user_name, password|
session[:admin] = (user_name == "name" && password == "pass")
end
end