Devise предотвращает автоматический вход после регистрации

TL;DR: я пытаюсь создать нового пользователя Devise из учетной записи администратора, но после завершения регистрации администратор отключается и входит в систему как новый пользователь.

Вот мой сценарий:

Пользователи могут зарегистрироваться на моем веб-сайте, введя логин своего университета. Мое приложение сверяет этот логин с университетским LDAP и, если он существует, дублирует университетскую запись LDAP в моем собственном LDAP + создает запись базы данных для пользователя в приложении rails. Пока это хорошо и работает:

Я делаю это, переопределяя контроллер регистрации Devise.

class Student::RegistrationsController < Devise::RegistrationsController

  skip_before_filter :access_denied

  def create
    login = sign_up_params[:login]
    if already_in_our_ldap?(login) 
      redirect_to root_path and return
    else
      # Ask our university LDAP
      university_ldap_entry = get_university_student(login)
      # If the entry was found on the LDAP
      if university_ldap_entry
        add_to_our_ldap(university_ldap_entry)
        # resume controller action
      else
        redirect_to new_user_registration_path and return
      end
    end

    # Rest is more or less copy paste from Devise RegistrationController
    build_resource(sign_up_params)
    resource_saved = resource.save
    yield resource if block_given?
    if resource_saved
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_flashing_format?
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      set_minimum_password_length
      respond_with resource
    end
  end
end

В моем случае

Администратор должен иметь возможность регистрировать студентов, уже подключенных к моему веб-сайту.

Итак, у меня есть представление, которое порождает модальное окно, в котором можно запросить имена в университетском LDAP, и форму, которая будет отправлять логин в указанный выше Student::RegistrationsController...

ИСПОЛЬЗОВАНИЕ АЯКС

Моя проблема

Формы AJAX работают хорошо, они успешно дублируют запись LDAP университета в нашем LDAP + создают запись в базе данных

НО

Он также создает сеанс, соответствующий сеансу нового пользователя (даже не запрашивая пароль). Таким образом, администратор, который использовал модальное окно для регистрации студента, отключается от своего сеанса (и, кроме того, это делается через AJAX, и он не заметит, что он был отключен/повторно подключен как другой пользователь, если он не перезагрузит страницу)

Конечно, предполагаемое поведение заключается в том, что использование модального окна должно просто создать запись LDAP + DB без изменения сеанса.

ИЗМЕНИТЬ

Собственно, он и подключает пользователя после html/POST регистрации. Мой код отправляет пароль по электронной почте пользователю, который только что зарегистрировался, поэтому я не хочу, чтобы новый пользователь мог автоматически подключаться, просто введя действительный логин =_=!


person Cyril Duchon-Doris    schedule 18.06.2015    source источник


Ответы (1)


Прошу прощения, я не совсем понял sign_up функцию devise. Я думал, что этот метод завершает создание новой записи пользователя, но вместо этого он просто пытается sign_in от имени вновь созданного пользователя.

Так что достаточно было закомментировать строку sign_up

Я не являюсь носителем английского языка, но я думал, что sign_in означает фактическое подключение с учетными данными, в то время как sign_up было актом подписки на веб-сайт (не обязательно подключаться сразу после этого). Я ошибся ?

person Cyril Duchon-Doris    schedule 19.06.2015
comment
sign_in — это то, что вы делаете, когда хотите попасть на веб-сайт. я полагаю, что метод devise sign_up представляет собой функцию, которая регистрирует пользователя, когда он регистрируется, см. здесь ----› rubydoc.info/github/plataformatec/devise/Devise/ - person BKSpurgeon; 09.07.2016
comment
сэкономил мне кучу времени :) - person Sebastian Delgado; 19.12.2016