Как я могу настроить свое приложение, чтобы разрешить только определенные электронные письма для регистрации в devise? - PullRequest
0 голосов
/ 12 ноября 2019

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

Я просмотрел бесчисленные сообщения, но они в основном используют почтовые доменыили логин одного человека. Я также пытался создать свой собственный метод проверки в моем User.rb, но я не могу его получить.

validate :check_email

  private

  def check_email
    @users = User.all

    if @users == '123.example@gmail.com')
        events_path
    else
        errors.add(:email, 'is not authorized')
    end
  end

Я не получаю явной ошибки, но приложение, похоже, пропускает мой 'if 'условие и выводит условие' else '.

Ответы [ 2 ]

2 голосов
/ 12 ноября 2019

Самый простой способ сделать это - создать пользовательскую проверку, как вы делали изначально. В вашей пользовательской модели вы можете создать проверку, которая будет выглядеть примерно так:

validate :is_email_valid?


def is_email_valid
    if ["example@gmail.com", "example@yahoo.com", "123.example@gmail.com"].include?(self.email)
        errors.add :base, "Your email is not authorized for use!"
    end
end

Этот код будет работать при сохранении или создании новой записи.

Проблема с вашим кодом заключается в том, что вы пытаетесь проверить объект ActiveRecord_Relation, который не может напрямую получить доступ к проверкам для экземпляров классов. Это все равно что пытаться вызвать метод экземпляра с уровня класса;Вы должны проверять одного пользователя за раз. Вы захотите выполнить проверки вашего экземпляра объекта со ссылкой на self. Таким образом, цикл через ваших пользователей, а затем проверка будет работать. Вот пример:

User.all.each do |i|

    if i.valid?
        puts "VALID"
    else
        puts "INVALID"
    end
end
0 голосов
/ 12 ноября 2019

Сара,

Первым шагом, который я предпринял бы для достижения этой цели, было бы работать внутри devis's registrations_controller. Это контроллер, на котором будет обслуживаться зарегистрированный пользователь, и здесь вы захотите переписать часть кода Devise. Убедитесь, что сначала создаются контроллеры, запустив генератор контроллеров Devise:

rails generate devise:controllers users

Затем вы захотите найти registrations_controller.rb пользователя и переопределить там код в действии create. Вот пример кода, который я написал, чтобы переопределить контроллер администратора Devise:

def create
    build_resource(sign_up_params)
    # Below - If admin is coming from an email invite or shared invite link, grabs both token and workplace id from params.
    @token = params[:invite_token] if params[:invite_token]
    @workplace_id = params[:workplace_id] if params[:workplace_id]
    @workplace = Workplace.find(params[:workplace_id]) if params[:workplace_id] # Finds the workplace from the workplace_id, works for both invite email and shared link.
    @institute = @workplace.institute if params[:workplace_id]
    if @institute && @institute.has_super_admins?
      resource.super_admin = false
    end 

    if resource.save
      yield resource if block_given?
      if resource.persisted?
        if resource.active_for_authentication?
          # Below - If admin came from a shared workpalce invite link or email workplace invite
          if @token != nil # Admin signed up via a workplace invite email or the shared link
            # Below - Checks Payment plan for admins joining an institute to make sure the institute didn't exceed user count subscription permission.
            unless @institute.plan.unlimited_users? 
              if @institute.plan.user_count <= @institute.admins.count # Admin doesn't join workplace since institute has excited user allowance
                set_flash_message! :alert, :signed_up_no_workplace, :workplace => @workplace.name, :institute => @institute.name, :workplace_owner => @institute.subscription.admin.name
                sign_up(resource_name, resource)
                respond_with resource, location: institute_admin_path(resource.institute, resource)
              else # Admin successfully signs up and joins the workplace. Method is below in protected
                join_workplace_and_redirect
              end 
            else # Admin successfully signs up and joins the workplace. Method is below in protected
              join_workplace_and_redirect
            end
          else # Fresh admin signup
            sign_up(resource_name, resource)
            if resource.super_admin? # Checks if the admin is a super_admin and set as true, if so redirects to another page
              set_flash_message! :notice, :super_admin_signed_up, :name => resource.first_name
              respond_with resource, location: new_institute_path()
            else # Admin is not a super_admin and not first one who signed up inside a city. 
              set_flash_message! :notice, :admin_signed_up, :link => edit_institute_admin_path(resource.institute, resource), :city => resource.institute.name
              respond_with resource, location: after_sign_up_path_for(resource)
            end 
          end
        else
          set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
          expire_data_after_sign_in!
          respond_with resource, location: after_inactive_sign_up_path_for(resource)
        end
      else
        flash[:alert] = "Your profile could not be created. See why below!"
        set_flash_message! :alert, :"signed_up_but_#{resource.inactive_message}"
        redirect_to request.referrer
      end
    else  # Failed to save
      clean_up_passwords resource
      respond_with resource, location: new_admin_registration_path(workplace: @workplace)
    end
  end

Чтобы применить его к вашему делу, вы можете использовать оператор case, чтобы проверить, соответствует ли электронное письмо тому, которое вы хотитеэто к. Например, ниже вы захотите проверить атрибут электронной почты resource (в данном случае это единственный пользователь, который регистрируется), чтобы определить, успешен он или нет:

# Checks emails that are allowed
case resource.email 
when "123.example@gmail.com" 
  if resource.save # Success
    set_flash_message! :notice, :signup_succeed
    respond_with resource, location: home_page(resource)
  else # For some reason the allowed email didn't go through due to other validations
    set_flash_message! :alert, :signup_failure
    respond_with resource, location: new_user_path(resource)
  end 
else # Entered an email that is not allowed
  set_flash_message! :alert, :email_invalid
  respond_with resource, location: new_user_path(resource)
end

set_flash_message! - разрабатывает пользовательские сообщения, которые можно редактировать в config/locales/devise.en.yaml. Второе ключевое слово относится к имени ключа yaml, и вы можете настроить там сообщение об ошибке или об успехе. respond_with - это перенаправление и местоположение. Вы можете использовать столько операторов when, сколько необходимо. Это всего лишь один из способов сделать это. Надеюсь, это поможет.

...