【问题标题】:Simple password authentication to the whole site in Rails在 Rails 中对整个站点进行简单的密码验证
【发布时间】:2014-06-20 05:54:24
【问题描述】:

我有一个用 Rails 重写的 PHP 应用程序。我唯一没有实现的是身份验证。我是唯一的有效用户,所以我只是将表单 POST 输入与硬编码的哈希值进行了比较。 (因此,带有注册等功能的 gem 是矫枉过正的)

我拥有的最接近的等价物是application_controller.rb 文件中的http_basic_authenticate_with 命令。不过我更喜欢在网站上有密码字段,也不必输入用户名。

这是 PHP 外观的粗略伪代码。这个到 Ruby on Rails 的最佳翻译是什么?

<?php
session_start();

if (! empty($_GET['logout']))
{
    session_destroy();
    header('Location: ?');
    die;
}
else if (! empty($_SESSION['logged_in']))
{
  // application code

  ?>
  <a href="?logout=true">Log out</a>
  <?php
}

else if (! empty($_POST['password']) && sha1($_POST['password']) === 'abc')
{
    $_SESSION['logged_in'] = true;
}

else
{
    ?>
    <form method="POST">
        <input type="password" name="password">
        <input type="submit" value="Log in">
    </form>
    <?php
}

【问题讨论】:

    标签: ruby-on-rails ruby authentication ruby-on-rails-4


    【解决方案1】:

    身份验证

    您将希望设置一个 session 值,您的用户可以在网站上携带该值(允许您进行测试以确定各种交互性)。

    您似乎已经在 PHP 中这样做了,所以我将在下面翻译您的代码;但是您可能还希望查看how Devise do this - 因为这是 Rails 中使用最广泛的身份验证 Gem,他们显然做对了。

    Rails 的美妙之处在于它允许sessions 在您的整个应用程序中工作,即使他们访问大量页面,您也可以让某人保持登录状态

    --

    框架

    您当前的代码是一个简单的脚本;这需要模块化以与 Rails MVC 结构一起使用。这是使用controllersactions 实现的 - 由routes 访问。 Devise 使用 Sessions controller

    #config/routes.rb
    resources :sessions
    
    #app/controllers/sessions_controller.rb
    Class SessionsController < ApplicationController
       def create
           sessions[:user][:authentication] = SecureRandom.hex(8)
       end
    
       def destroy #-> this will use the DELETE HTTP Verb
           session[:user][:authentication].delete
           redirect_to root_path
       end
    end
    

    如果您想检查用户是否登录,您需要做的就是检查session[:user][:authentication] 变量,它可以在helper 中处理:

    #app/helpers/authentication_helper.rb
    class AuthenticationHelper
        def user_signed_in?
            session[:user][:authentication].present?
        end
    end
    

    这有几件重要的事情需要考虑:

    1. 您需要使其尽可能模块化
    2. 您需要确保没有密码保存在任何地方,而是保存在数据库中(即使这样,它们也应该被散列)
    3. 您需要尽可能保持干燥

    显然是一个非常简短的概述 - 如果您需要,我可以解释更多?

    【讨论】:

    • 感谢您的回复。我认为像 devise 这样的 gem 或任何使用数据库模型的东西都是矫枉过正的原因是因为我是这个应用程序的唯一有效用户。但是您的回答有助于会话等,所以我会尽快尝试。
    • 我最终将 Devise 与 single user mode 一起使用
    【解决方案2】:

    我不确定您是否可以直接翻译...您应该创建一个会话控制器,您可以在其中设置登录功能,在那里您可以评估 params[:password] 是否等于“abc”并创建会话的 cookie,还创建注销方法来销毁它,您必须为这些方法创建路由。 您可能想在您的应用程序助手中创建一个助手,检查 cookie 是否存在以仅在需要时显示表单,让我知道这个答案是否足够或告诉我女巫部分给您带来麻烦,问候

    【讨论】:

    • 我忘记了另一件事,你应该在控制器中有一个 before_filter 来防止在没有登录的情况下进入你不想要的页面
    【解决方案3】:

    如果您想知道或将代码更改为导轨。看一下这个。 我知道这个可以帮助你,这样你就可以专注于 Rails 代码

    来源:https://www.youtube.com/watch?v=h0k6DFIStFY

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 2014-04-15
      • 2016-04-05
      • 2014-03-11
      • 2014-05-13
      • 2011-12-19
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多