在rails上的ruby中创建安全登录

时间:2014-05-16 03:03:30

标签: ruby-on-rails ruby

我正在尝试创建一个需要用户名和密码的安全登录。我正在努力解决这个问题。当我尝试访问我的登录页面时,收到<%= form_tag login_url do%>的错误在登录页面中。如果有人能帮助我完成这项工作,你将成为我的英雄。

包含用户名和密码的表的架构

create_table "users", force: true do |t|
    t.string   "name"
    t.string   "password_digest"
    t.string   "password"
    t.string   "password_confirmation"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

表中包含用户名和密码的控制器

class User < ActiveRecord::Base
  has_secure_password
end

登录页面(我无法开始工作)

<h2>The Maintenance Functions are restricted to authorized users. Please login below</h2>
<%= form_tag login_url do %>
  <p>
    <label for="name">Name:</label>
    <%= text_field_tag :name, params[:name] %>
  </p>
  <p>
    <label for="password">Password:</label>
    <%= password_field_tag :password, params[:password] %>
  </p>
  <%= submit_tag "login" %>
<% end %>

登录页面的控制器

class SessionsController < ApplicationController 
  def new  
  end

  def create 
    user = User.find_by_name(params[:name])

    if user and user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to secertin_secertout_path :notice => "Logged in successfully"
    else
      flash.alert = "Invalid userid/password combination"
      render 'new' 
    end
  end

  def destroy 
    session[:user_id] = nil
    redirect_to root_url_path :notice => "Logged Out" 
  end
end

2 个答案:

答案 0 :(得分:0)

您最好使用Devise(或者Authlogic

原因是,有时候外包与user authentication一样重要的事情会更好。为什么?有几个原因:

  
      
  1. 它是您应用的重要组成部分
  2.   
  3. 它需要适应HTTP安全性的变化
  4.   
  5. 它需要与其他依赖项一起使用
  6.   

如果你推出自己的身份验证(这并不困难),那么你的主要问题就是你不会拥有其中一个解决方案提供的可扩展性或可靠性。我高度建议使用devise - 它完全按照你的需要做了

答案 1 :(得分:0)

从表中删除passwordpassword_confirmation列,您的代码应该有效。 has_secure_password为您提供虚拟属性passwordpassword_confirmation,但它会在password_digest列的表格中存储密码的哈希版本。不在数据库中存储密码的纯文本版本是has_secure_password安全的一部分。