Проверьте, является ли пользователь действительным для аутентификации, только если использует базу данных аутентифицируемую - PullRequest
0 голосов
/ 30 ноября 2018

Пользователи могут войти в наше приложение с помощью OmniAuth или по электронной почте и паролю (но только если они были приглашены).

У нас есть метод, который проверяет, может ли пользователь выполнить вход по электронной почте и паролю, как описано ниже.:

def active_for_authentication?
  super && valid_for_authentication
end

private
# Check wheter user was invited or not   
def valid_for_authentication
  User.invitation_accepted.find_by(id: id).present?
end

Это работает нормально, но когда я хочу войти в систему с помощью OmniAuth, этот метод блокирует меня.Могу ли я указать, чтобы обойти этот метод, если используется аутентификация OmniAuth?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

В конце концов, я понял это по-другому.active_for_authentication? и valid_for_authentication были удалены.

Затем в app/models/user.rb я определил следующий код на основе https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address#overwrite-devises-find_for_database_authentication-method-in-user-model

  def self.find_for_database_authentication(warden_conditions)
    if valid_for_database_authentication?(warden_conditions)
      super
    else
      throw :warden, message: not_allowed_for_authentication
    end
  end

  # Check wheter user was invited or not
  private_class_method def self.valid_for_database_authentication?(params)
    User.invitation_accepted.find_by(params).present?
  end

  private_class_method def self.not_allowed_for_authentication
    I18n.t('devise.failure.user.not_allowed_for_authentication')
  end
0 голосов
/ 30 ноября 2018

Вы можете проверить ниже метод перед выполнением active_for_authentication?Строки

В следующих строках будет, если возвращаются некоторые res данные при входе с использованием omniauth, добавить логику , если только res.present?

def logged_using_omniauth? request
  res = nil
  omniauth = request.env["omniauth.auth"]
  res = Authentication.find_by_provider_and_uid 
  (omniauth['provider'], omniauth['uid']) if omniauth
  res  
end
...