为Rails创建简单的站点密码-无用户名

时间:2018-07-05 18:35:36

标签: ruby-on-rails

我想用一个非常简单的密码保护网站来保护用户首次访问该网站。我目前使用http身份验证,但这需要用户名和密码。我可以在后端对密码进行硬编码。网站的基础知识:当地体育联赛,我们保留我们的统计信息和联赛信息。只是试图将“ riff-raff”拒之门外:)
我是Rails新手的红宝石,并且正在使用本网站作为学习的方式。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

您可以做一些基于cookie的事情。

在您的ApplicationController中,您将实现一种确定cookie是否存在的方法,该方法指出访问者已经输入了密码-如果cookie不存在,那么您将重定向至密码页面:

class ApplicationController < ActionController::Base

  def require_password_verification
    unless cookies[:visitor_password_verified]
      return redirect_to <whatever your passwords#new path is>
    end
  end

end

“密码”页面的控制器如下所示:

class PasswordController < ApplicationController
  def new
    # Nothing needed here because all your #new view needs is a password field
  end

  def create
    unless params[:password].present?
      return redirect_back(fallback_location: root_path, alert: 'Password is required.')
    end

    if params[:password] == Rails.configuration.visitor_password
      cookies[:visitor_password_verified] = true
      redirect_to(root_path, notice: 'Password verified.')
    else
      cookies.delete(:visitor_password_verified)
      redirect_back(fallback_location: root_path, alert: 'You've entered the wrong password.')
    end
  end
end

您的密码将存储在application.rb文件中,如下所示:

config.visitor_password = '12345'

通常,您永远不会以这种方式存储密码,因为它根本不安全,但考虑到您的用例,可能就可以了,因为每个人只有一个密码已经不安全了。但是,如果您确实想提高安全性,我建议您将密码存储在环境变量中,然后可以这样设置密码:

config.visitor_password = ENV['VISITOR_PASSWORD']

这样,至少查看您(假定为公共)存储库的任何人都不会对您的密码进行硬编码和访问。

然后您可以为想要的任何视图要求“已输入密码” cookie:

class LeagueStatsController < ApplicationController

  before_action :require_password_verification

  def index
    # Whatever
  end
end

如果有人点击了您的league_stats#index页面,则将进行检查以确保visitor_password_verified cookie存在且正确。如果是这样,那么他们将直达视图。如果不是,它们将被重定向到您的passwords#new页面。