Bcrypt с двумя разными моделями пользователей на рельсах 5.2
У меня есть две таблицы миграции: родители и учителя. И я использую Bcrypt для регистрации. Я не могу понять, что мне делать с входом в систему и session_controller (сессионный помощник). Я могу зарегистрировать нового пользователя, и когда пользователь регистрируется, он может видеть только ссылку "Выйти" на панели навигации. Тем не менее, я не могу выйти из пользователя, я не уверен, как я определяю методы в контроллере сеансов и помощнике сеанса. Может, кто-нибудь может мне помочь с этим? Я не могу найти информацию о bcrypt с разными моделями пользователей - эта вещь не популярна или это так просто, и я просто тупой и ничего не понимаю??
class SessionsController < ApplicationController
include SessionsHelper
def new
end
def create
teacher = Teacher.find_by(email: params[:session][:email])
parent = Parent.find_by(email: params[:session][:email])
if teacher && teacher.authenticate(params[:session][:password])
log_in teacher
redirect_to documents_path
flash[:notice] = "Welcome!"
elsif parent && parent.authenticate(params[:session][:password])
log_in parent
redirect_to root_path
flash[:notice] = "Welcome!"
else
flash[:alert] = "Please log in again!"
render 'new'
end
end
def destroy
if log_out parent
redirect_to root_path
elsif log_out teacher
redirect_to root_path
end
end
end
И вот мой помощник сессий:
module SessionsHelper
# Logs in the given user.
def log_in(parent)
session[:parent_id] = parent.id
end
def log_in(teacher)
session[:teacher_id] = teacher.id
end
# Returns the current logged-in user (if any).
def current_teacher
@current_teacher ||= Teacher.find_by(id: session[:teacher_id])
end
def current_parent
@current_parent ||= Parent.find_by(id: session[:parent_id])
end
# Returns true if the user is logged in, false otherwise.
def logged_in?(teacher)
!current_teacher.nil?
end
def logged_in?(parent)
!current_parent.nil?
end
def log_out(teacher)
session.delete(:teacher_id)
@current_teacher = nil
end
def log_out(parent)
session.delete(:parent_id)
@current_parent = nil
end
end
1 ответ
Я не знаю деталей вашего заявления, но могу объяснить общий случай.
Прежде всего, контроллер, который имеет функцию входа в систему, не должен быть назван sessions_controller
зовут что-нибудь ок.
А Bcrypt - это всего лишь библиотека для шифрования паролей. Основной процесс проверки - введенный пользователем пароль действителен или нет без расшифровки. Нет четкого ответа, как реализовать логику контроллера.
Видимо, пользователь делится на два типа, учитель и родитель, и, вероятно, каждый из них имеет разные функции. По сути, я хочу разделить два процесса входа в систему на отдельные контроллеры или действия. Потому что каждый процесс входа не один и тот же.
Но Учитель и Родитель будут входить в систему с одним и тем же URL-адресом, если пользователь должен войти в систему с одной и той же страницы из-за ограничений пользовательского интерфейса. Если вы находитесь в таких обстоятельствах, целесообразно реализовать в одном контроллере и действии.
В конце концов, это зависит от того, как разработать ваше приложение. Так что ваш код не всегда неверен.
Тем не менее, посмотрите на ваш код, учитель или родитель оценивается только по электронной почте, вряд ли это правильный подход. Я не видел много сайтов, на которых пользователи с разными привилегиями заходят на одну и ту же страницу.
Я думаю, что это в основном разделить страницу входа в зависимости от учителя или родителей. Если вы разделите страницу входа, пример будет следующим.
class TeachersController < ApplicationController
include SessionsHelper
def login
end
def login_action
teacher = Teacher.find_by(email: params[:teacher][:email])
if teacher && teacher.authenticate(params[:teacher][:password])
log_in teacher
flash[:notice] = 'Welcome!'
redirect_to root_path
else
flash[:notice] = 'Invalid log in information!'
redirect_to action: :login
end
end
def logout
teacher = Teacher.find(session[:teacher_id])
log_out teacher
redirect_to root_path
end
end
class ParentsController < ApplicationController
include SessionsHelper
def login
end
def login_action
parent = Parent.find_by(email: params[:parent][:email])
if parent && parent.authenticate(params[:parent][:password])
log_in parent
flash[:notice] = 'Welcome!'
redirect_to root_path
else
flash[:notice] = 'Invalid log in information!'
redirect_to action: :login
end
end
def logout
parent = Parent.find(session[:parent_id])
log_out parent
redirect_to root_path
end
end
Хотя это не главная проблема, вы написали session_helper в helpers
каталог?
Обычно для реализации логики представления используется помощник, поэтому, если вы хотите поделиться методом в контроллере, используйте ActiveSupport::Concern
в concerns
каталог.