如何使用Ruby on Rails添加用户身份验证

夜色温柔 2022-07-14 ⋅ 13 阅读

身份验证是现代应用程序中不可或缺的一部分。它使我们能够限制访问和保护用户的个人信息。在本博客中,我们将学习如何使用Ruby on Rails构建一个简单的用户身份验证系统。

步骤1:创建Rails应用程序

首先,我们需要创建一个新的Rails应用程序。在终端中运行以下命令:

$ rails new user-authentication
$ cd user-authentication

这将创建一个名为user-authentication的新的Rails应用程序,并将你切换到该目录中。

步骤2:创建User模型和数据库表

接下来,我们将创建一个名为User的模型和相关的数据库表。在终端中运行以下命令:

$ rails generate model User name:string email:string password_digest:string
$ rails db:migrate

这将生成一个具有姓名、电子邮件和密码散列字段的User模型,并在数据库中创建相关的表。

步骤3:添加bcrypt gem

我们将使用bcrypt gem来处理用户密码的安全散列。在Gemfile中添加以下代码:

gem 'bcrypt', '~> 3.1.7'

然后运行bundle install来安装gem。

步骤4:更新User模型

app/models/user.rb文件中,添加以下代码来设置用户身份验证:

class User < ApplicationRecord
  has_secure_password
end

has_secure_password会自动提供密码散列和验证功能。

步骤5:创建用户注册和登录页面

我们将创建用户注册和登录页面,以便用户可以创建新账户并使用已有的账户进行登录。在终端中运行以下命令:

$ rails generate controller Registrations new create
$ rails generate controller Sessions new create

这将分别生成名为RegistrationsControllerSessionsController的控制器,并创建相关的视图文件。

app/views/registrations/new.html.erb文件中,添加以下代码来显示用户注册表单:

<h1>注册</h1>

<%= form_with model: @user, url: registrations_create_path do |form| %>
  <%= form.label :name %>
  <%= form.text_field :name, autofocus: true %>

  <%= form.label :email %>
  <%= form.email_field :email %>

  <%= form.label :password %>
  <%= form.password_field :password %>

  <%= form.label :password_confirmation %>
  <%= form.password_field :password_confirmation %>

  <%= form.submit "注册" %>
<% end %>

app/views/sessions/new.html.erb文件中,添加以下代码来显示用户登录表单:

<h1>登录</h1>

<%= form_with url: sessions_create_path do |form| %>
  <%= form.label :email %>
  <%= form.email_field :email, autofocus: true %>

  <%= form.label :password %>
  <%= form.password_field :password %>

  <%= form.submit "登录" %>
<% end %>

<p>
  还没有账号?<a href="<%= registrations_new_path %>">注册</a>
</p>

步骤6:更新控制器和路由

更新app/controllers/registrations_controller.rb文件,添加以下代码来处理用户注册:

class RegistrationsController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      redirect_to root_path, notice: "账号创建成功!请登录。"
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

更新app/controllers/sessions_controller.rb文件,添加以下代码来处理用户登录:

class SessionsController < ApplicationController
  def new
  end

  def create
    @user = User.find_by(email: params[:email])

    if @user && @user.authenticate(params[:password])
      session[:user_id] = @user.id
      redirect_to root_path, notice: "登录成功!"
    else
      flash.now.alert = "无效的邮箱或密码!"
      render :new
    end
  end
end

config/routes.rb文件中,添加以下代码来定义注册和登录的路由:

Rails.application.routes.draw do
  root "pages#home"

  get "signup", to: "registrations#new", as: "registrations_new"
  post "signup", to: "registrations#create", as: "registrations_create"

  get "login", to: "sessions#new", as: "sessions_new"
  post "login", to: "sessions#create", as: "sessions_create"
end

步骤7:添加注销功能

最后,我们还可以添加一个注销功能,以允许用户退出登录。在app/views/layouts/application.html.erb文件中,添加以下代码:

<% if current_user %>
  <%= link_to "注销", logout_path, method: :delete %>
<% else %>
  <%= link_to "登录", sessions_new_path %>
  <%= link_to "注册", registrations_new_path %>
<% end %>

app/controllers/application_controller.rb文件中,添加以下代码来处理注销:

class ApplicationController < ActionController::Base
  before_action :current_user

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  helper_method :current_user
end

更新config/routes.rb文件中的路由:

Rails.application.routes.draw do
  # ...

  delete "logout", to: "sessions#destroy", as: "logout"
end

更新app/controllers/sessions_controller.rb文件,添加以下代码来处理注销:

class SessionsController < ApplicationController
  # ...

  def destroy
    session[:user_id] = nil
    redirect_to root_path, notice: "注销成功!"
  end
end

恭喜!你已经成功添加了用户身份验证功能。用户现在可以注册、登录和注销他们的账户。

在这篇博客中,我们学习了如何使用Ruby on Rails构建一个简单的用户身份验证系统。这只是一个入门级别的实现,你可以根据自己的需求进行扩展和定制。希望你能从中受益,并将它应用于自己的项目中。祝你好运!


全部评论: 0

    我有话说: