在Rails 5.2上具有两个不同用户模型的Bcrypt

时间:2018-09-08 22:32:12

标签: ruby-on-rails-5 bcrypt

我有两个迁移表:父母和老师。我使用Bcrypt进行注册。我不知道该如何登录和sessions_controller(会话帮助程序)。我可以注册新用户,当用户注册时,他只能在navbar中看到“注销”链接。但是,我无法注销用户,我不确定如何在会话控制器和会话帮助器中定义方法。也许有人可以帮我这个忙吗? 我找不到有关具有不同用户模型的bcrypt的信息-这件事不受欢迎还是如此简单,我只是愚蠢的,不了解某件事?

static void Main(string[] args)
{
    // load the file.
    var file = File.ReadAllText("Example.json");

    // to generate the 'Example' classes from JSON I used
    // https://app.quicktype.io and changed the name to 'Example'
    var example = JsonConvert.DeserializeObject<Example>(file);

    // select the value of each dictionary entry into a list.
    var sections = example.Sections.Select(x => x.Value).ToList();
}

这是我的会话助手:

 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

1 个答案:

答案 0 :(得分:0)

我不知道您的应用程序的详细信息,但我可以解释一般情况。

首先,不必将具有登录功能的控制器命名为sessions_controller,可以确定名称。

Bcrypt基本上只是一个用于加密密码的库。主要过程是在不解密的情况下检查用户输入的密码是否有效。没有明确的答案如何实现控制器逻辑。

显然,用户分为教师和父母两种类型,并且可能各自具有不同的功能。所以从本质上讲,我想将两个登录过程划分为单独的控制器或动作。因为每个登录过程都不相同。

但是如果由于UI限制用户必须从同一页面登录,则Teacher和Parent将使用相同的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

尽管这不是主要问题,但是您是否在helpers目录中编写了sessions_helper?

通常,辅助程序用于实现视图逻辑,因此,如果要在控制器中共享方法,请在ActiveSupport::Concern目录中使用concerns