Создавать аутентификацию без пароля, используя только имя пользователя
Можно ли настроить 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