Создавать аутентификацию без пароля, используя только имя пользователя

Можно ли настроить Devise для аутентификации без пароля?

Это приложение для интранета. Для того, чтобы подключиться к нему, вам, во-первых, нужно быть в сети VPN, плюс приложение позволяет только видеть статус заказов и историю, а не отправлять какую-либо информацию. Я полагаю, что похож на сайт отслеживания FedEx или UPS, но позволяет пользователю видеть всю учетную запись, с дополнительной безопасностью VPN-бокса, который клиент получает от нас.

Теперь мне все еще требуется пароль, но это необоротное требование для проекта. Клиенты привыкли к этой схеме и не очень хорошо разбираются в компьютерах, чтобы быстро адаптироваться к изменениям.

Ответ 1

Не слишком элегантное решение (не требующее модификации Devise): используйте пароль по умолчанию, одинаковый для всех пользователей

Используйте before_validation вызов before_validation чтобы установить для user.password и user.password_confirmation значение по умолчанию (например, password).

Создание представлений Devise с помощью rails generate devise:views

Измените форму входа, чтобы добавить скрытое поле пароля со значением пароля по умолчанию.

Как я уже сказал, не элегантно, но это должно сработать без необходимости копаться во внутренностях Devise.


Более элегантное решение:

Разрабатывайте проект Devise на GitHub и адаптируйте https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/database_authenticatable.rb к вашим потребностям.

Затем вы можете указать свой форк в Gemfile.

Ответ 2

В этом случае я предпочитаю monkey-patch Devise::Strategies::Authenticatable вместо того, чтобы развернуть весь репозиторий для создания одной строки.

Devise::Strategies::Authenticatable.class_eval do
  private
    def valid_password?
      true
    end
end

Просто поместите его в файл инициализатора или в конец инициализатора devise.rb (я предпочитаю это, потому что он немного похож на дополнительную конфигурацию).

Чтобы объяснить, исправленный здесь valid_password? обычно возвращает password.present? и используется Devise::Strategies::DatabaseAuthenticatable в качестве начальной проверки пароля перед фактической проверкой его на базу данных. Поэтому это изменит поведение, когда пароль не будет предоставлен.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это работает до сих пор для меня, но не полностью протестировано, поэтому используйте на свой страх и риск.

Ответ 3

Довольно поздно, но это определенно можно сделать с помощью sign_in, включив Devise::Controllers::Helpers если вы еще не наследуете от DeviseController или контроллера, который наследует от DeviseController (такого как Devise::SessionsController). Затем просто позвоните sign_in(user):

class SignInWithoutPasswordsController < ApplicationController
  include Devise::Controllers::Helpers

  def sign_a_user_in_without_password
    user = User.find(params[:user_id])
    sign_in(user)
  end
end