TL;DR : Опитвам се да създам нов потребител на Devise от администраторски акаунт, но след като регистрацията приключи, администраторът се прекъсва и влиза като новия потребител.
Ето моят сценарий:
Потребителите могат да се регистрират на моя уебсайт, като въведат данните си за вход в университета. Моето приложение проверява това влизане спрямо университетския LDAP и ако съществува, то ще дублира университетския LDAP запис в моя собствен LDAP + ще създаде запис в база данни за потребителя в приложението rails. Засега това е добре и работи:
Правя това, като отменя Devise Registration Controller
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
Моят проблем
AJAX формулярите работят добре, успешно дублират университетския LDAP запис в нашия LDAP + създайте записа в базата данни
НО
Той също така създава сесия, съответстваща на тази на новия потребител (без дори да иска паролата). Така че администраторът, който е използвал модала, за да регистрира ученик, е изключен от неговата сесия (и на всичкото отгоре това се прави чрез AJAX и той няма да забележи, че е бил прекъснат/свързан отново като друг потребител, освен ако не презареди страницата)
Разбира се, предвиденото поведение е, че използването на модала трябва просто да създаде LDAP+DB запис, без да променя сесията.
РЕДАКТИРАНЕ
Всъщност той също свързва потребителя след html/POST регистрация. Моят код изпраща паролата по имейл на потребителя, който току-що се е регистрирал, така че не искам новият потребител да може да се свързва автоматично само чрез въвеждане на валидно име =_= !