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 регистрации. Мой код отправляет пароль по электронной почте пользователю, который только что зарегистрировался, поэтому я не хочу, чтобы новый пользователь мог автоматически подключаться, просто введя действительный логин =_=!