Я пишу портал, который будет открыт только для людей, которые работают в моей компании.Я использую платформу Devise для обработки аутентификации, но есть требование, что только сотрудники должны иметь возможность зарегистрироваться.Отдел кадров выдаст каждому сотруднику случайно сгенерированный код доступа, а затем этот сотрудник будет использовать свой номер сотрудника и код доступа для получения начального доступа к сайту.После того как пользователь прошел аутентификацию, Devise может обработать функциональность для завершения регистрации.
Мы изучили devise_invitable, но решили не использовать его, потому что не хотим собирать адреса электронной почты от сотрудников.
Я реализовал это, создав собственное представление полномочий и контроллер для проверки комбинации номера сотрудника и кода доступа.Вот что я сделал:
В пользовательском контроллере, если комбинация номера сотрудника и кода доступа правильная, установите токен аутентификации в таблице токенов, установите соответствующий токен в сеансе пользователя и перенаправьте потокк регистрации / новый метод разработки.Вот некоторый псевдокод:
def check_authorization
if employee number and code are correct
token = SecureRandom.base58(36)
set database value to token
session[:authentication_token] = token
redirect_to devise_new_user_registration_path
else
render 'authorize'
end
end
В контроллере регистрации Devise проверьте токен сеанса, который совпадает с токеном в базе данных, если не найден поток перенаправления в мой пользовательский контроллер авторизации.Я также написал вспомогательный метод для очистки авторизаций после передачи управления Devise.Я внес изменения в методы new и create и оставил все остальное как есть.Еще псевдокод:
def new
if( get_authorization( session[:ot_authorization_token] ) == nil )
redirect_to custom_authorization_path
else
super
end
end
def create
authorization = get_authorization( session[:ot_authorization_token] )
if( authorization == nil )
redirect_to custom_authorization_path
else
super do |authorization|
clean_up( authorization )
end
end
end
Будет ли это работать?Я что-то пропустил?Заранее спасибо за помощь.