Devise - аутентификация пользователя с использованием неуникального поля - PullRequest
0 голосов
/ 05 июня 2019

В настоящее время мы аутентифицируем пользователей на основе их поля электронной почты.Однако это поле не является уникальным.Основная проблема заключается в том, что мы должны разрешать доступ только пользователям на основе поля user_type в таблице Users.Если есть 2 записи с одним и тем же адресом электронной почты, но разными user_type, мы хотим, чтобы Devise попытался войти, используя запись с user_type = 'Admin'.

Есть ли способ ограничить проверку подлинности Devise только для тех пользователей, которые имеютuser_type = 'Admin', а не другие?

1 Ответ

0 голосов
/ 05 июня 2019

Я нашел 2 решения моей проблемы

Первое, что я придумал сам, это было создание подкласса модели User под названием AdminUser с областью действия по умолчанию, которая позволяла только user_type = 'admin'

class AdminUsers < User
  default_scope { where(user_type: 'admin') }
end

Затем я просто обновил файл rout.rb, чтобы использовать эту модель вместо User

devise_for(
  :users,
  class_name: 'AdminUser',
  path:       'auth',
  controllers: {
    sessions: 'authentications',
    passwords: 'passwords'
  }
)

. Это прекрасно работает.Единственная маленькая вещь - то, что теперь current_user возвращает экземпляр AdminUser вместо User.Я не мог гарантировать, что это не вызовет проблем в некоторых случаях.

Второе решение было отсюда: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign_in-using-their-username-or-email-address

Я добавил этот метод, который перезаписывает один из внутренних устройств Devises вМодель пользователя.

def self.find_for_database_authentication(warden_conditions)
  where(warden_conditions).where("user_type = 'agent'").first
end

Второе решение работает отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...