如何为某些区域创建单独的Devise身份验证?

时间:2018-11-22 02:00:45

标签: ruby-on-rails devise ruby-on-rails-5

我的应用程序具有一个控制器,该控制器的操作需要在特殊密码后与经过身份验证的用户隔离。

一种想象的方式:普通用户开展业务。偶尔,管理员需要输入密码,以使普通用户可以访问该区域。

我在我的应用程序中以常规方式设置了Devise身份验证,因此所有用户都通过了身份验证。

我现在如何设置一个单独的密码,以便对控制器的所有调用都要求输入一个特殊的单独密码?

1 个答案:

答案 0 :(得分:1)

  

一种实现方法是在Devise身份验证的基础上从头开始引入简单身份验证   使用bcrypt库。

您将在users表中需要一个新字段来存储特殊密码摘要。因此,创建一个新的迁移文件,并为其添加以下代码:

def change
  add_column :users, :special_password, :digest
end

将Bcrypt宝石添加到您的Gemfile中:

gem 'bcrypt', '~> 3.1', '>= 3.1.12'

在您的用户模型中添加以下行:

has_secure_special_password

现在,在您的特殊密码验证控制器中,使用以下代码通过current_user来验证special_password

if current_user.authenticate(params[:user][:special_password])
  session[:special_user_id] = current_user.id
end

现在无论您要使用特殊密码对用户进行身份验证的任何控制器操作,都创建一个before_action过滤器并尝试通过session[:special_user_id]查找用户,如果找不到该用户,则可以要求他们输入special_password