Computer >> Máy Tính >  >> Lập trình >> Ruby

Xác thực trong Rails bằng cách sử dụng Cleaner

Cle clear là một hệ thống xác thực đơn giản với email và mật khẩu được xây dựng bởi nhóm tại Thoughtbot. Nó có các mặc định cố định nhưng nhằm mục đích dễ dàng ghi đè. Hệ thống được bảo trì tích cực và bạn có thể theo dõi trên GitHub.

Trong hướng dẫn này, bạn sẽ thấy cách tích hợp Clearance vào ứng dụng Rails. Chúng tôi sẽ sử dụng một ứng dụng thu nhỏ. Hãy bắt đầu nào!

Bắt đầu

Bạn sẽ bắt đầu bằng cách tạo ứng dụng Rails của mình. Với mục đích của hướng dẫn này, tôi sẽ đặt tên cho tôi là tutsplus-clearance .

rails new tutsplus-clearance -T

Điều đó sẽ làm nên điều kỳ diệu.

Bạn sẽ cần bootstrap để làm cho ứng dụng của bạn trông đẹp mắt. Thêm đá quý Bootstrap vào Gemfile của bạn .

#Gemfile

...
gem 'bootstrap-sass'

Cài đặt đá quý bằng cách chạy bundle install .

Bây giờ hãy sửa đổi application . scss trông như thế này:

#app/assets/stylesheets/application.scss

@import 'bootstrap-sprockets';
@import 'bootstrap';

Thiết lập giải phóng mặt bằng

Mở Gemfile của bạn để thêm đá quý Giải phóng mặt bằng.

#Gemfile

gem 'clearance'

Bây giờ hãy cài đặt gem.

bundle install

Tại thời điểm này, hãy chạy lệnh trình tạo để cài đặt clearance .

rails generate clearance:install

Điều này sẽ tạo ra một số đầu ra trên thiết bị đầu cuối của bạn, trông giống như những gì tôi có bên dưới:

create  config/initializers/clearance.rb
      insert  app/controllers/application_controller.rb
      create  app/models/user.rb
      create  db/migrate/20161115101323_create_users.rb

*******************************************************************************

Next steps:

1. Configure the mailer to create full URLs in emails:

    # config/environments/{development,test}.rb
    config.action_mailer.default_url_options = { host: 'localhost:3000' }

    In production it should be your app's domain name.

2. Display user session and flashes. For example, in your application layout:

    <% if signed_in? %>
      Signed in as: <%= current_user.email %>
      <%= button_to 'Sign out', sign_out_path, method: :delete %>
    <% else %>
      <%= link_to 'Sign in', sign_in_path %>
    <% end %>

    <div id="flash">
      <% flash.each do |key, value| %>
        <div class="flash <%= key %>"><%= value %></div>
      <% end %>
    </div>

3. Migrate:

    rake db:migrate

*******************************************************************************

Khi bạn chạy lệnh, một vài tệp đã được tạo trong ứng dụng của bạn. Một trong những tệp như vậy là clear.rb, bạn có thể tìm thấy tệp này trong config/initializers danh mục. Một User mô hình cũng đã được tạo và cùng với đó bạn cũng có một tệp di chuyển trông giống như sau:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.timestamps null: false
      t.string :email, null: false
      t.string :encrypted_password, limit: 128, null: false
      t.string :confirmation_token, limit: 128
      t.string :remember_token, limit: 128, null: false
    end

    add_index :users, :email
    add_index :users, :remember_token
  end
end

Theo kết quả đầu ra, điều đầu tiên bạn muốn làm là chỉnh sửa môi trường cấu hình của mình. Để làm điều đó, hãy điều hướng đến config/environments/development.rb và thêm dòng bên dưới, ngay phía trên end dấu phân cách.

...
  config.action_mailer.default_url_options = { host: 'localhost:3000' }
end

Tiếp theo, điều hướng đến config/initializers/clearance.rb để chỉnh sửa nó và khi bạn ở đó, hãy thay đổi địa chỉ email của người gửi từ mặc định thành bất kỳ địa chỉ nào bạn chọn. Đây là những gì bạn sẽ thấy khi mở tệp.

#config/initializers/clearance.rb

Clearance.configure do |config|
  config.mailer_sender = "[email protected]"
end

Bạn có thể ghi đè cấu hình mặc định bằng cách dán đoạn mã sau và định cấu hình nó theo yêu cầu của bạn.

#config/initializers/clearance.rb

Clearance.configure do |config|
  config.allow_sign_up = true
  config.cookie_domain = ".example.com"
  config.cookie_expiration = lambda { |cookies| 1.year.from_now.utc }
  config.cookie_name = "remember_token"
  config.cookie_path = "/"
  config.routes = true
  config.httponly = false
  config.mailer_sender = "[email protected]"
  config.password_strategy = Clearance::PasswordStrategies::BCrypt
  config.redirect_url = "/"
  config.secure_cookie = false
  config.sign_in_guards = []
  config.user_model = User
end

Chạy lệnh để di chuyển cơ sở dữ liệu của bạn.

rake db:migrate

Mở PagesController của bạn và thêm một index hành động.

#app/controllers/pages_controller.rb

class PagesController < ApplicationController
  def index
  end
end

Tiếp theo, tạo một dạng xem cho index hành động bạn vừa tạo.

Thêm đoạn mã bên dưới:

#app/views/pages/index.html.erb

<h1>Tutsplus Clearance</h1>
<p>Welcome to our Clearance Page.</p>

Chỉnh sửa các tuyến đường của bạn đến:

#config/routes.rb

Rails.application.routes.draw do
  root to: "pages#index"
end

Tạo một phần có tên _navigation.html.erb bên trong layouts danh mục. Điều này sẽ được sử dụng để xử lý mọi thứ liên quan đến điều hướng trên ứng dụng của bạn.

Dán mã sau và lưu.

#app/views/layouts/_navigation.html.erb

<nav class="navbar navbar-inverse">
  <div class="container">
    <div class="navbar-header">
      <%= link_to 'Tutsplus-Clearance', root_path, class: 'navbar-brand' %>
    </div>
    <div id="navbar">
    <% if signed_in? %>
        <ul class="nav navbar-nav">
        <li><%= link_to 'Add Page', new_page_path %></li>
        </ul>
    <% end %>

    <ul class="nav navbar-nav pull-right">
        <% if signed_in? %>
        <li><span><%= current_user.email %></span></li>
        <li><%= link_to 'Sign out', sign_out_path, method: :delete %></li>
        <% else %>
        <li><%= link_to 'Sign in', sign_in_path %></li>
    <% end %>
  </ul>
    </div>
  </div>
</nav>

<div class="container">
  <% flash.each do |key, value| %>
    <div class="alert alert-<%= key %>">
      <%= value %>
    </div>
  <% end %>
</div>

Quyền truy cập bị hạn chế

Với Cleaner, bạn có thể tạo quyền truy cập hạn chế vào các trang cụ thể mà bạn chọn trong ứng dụng của mình. Hãy xem nó được thực hiện như thế nào.

Tạo chế độ xem cho new hành động trong app/views/pages , tên của tệp phải là new.html.erb . Dán mã bên dưới.

#app/views/pages/new.html.erb

<h1>Restricted Page</h1>

<p>This page is restricted to authenticated users, if you can see this it means you are a superstar!</p>

Bây giờ bạn cần thêm dòng bên dưới vào config/routes.rb .

#config/routes.rb

...
  resources :pages, only: :new
...

Cuối cùng, đi tới PagesController của bạn làm cho nó giống như những gì tôi có bên dưới.

#apps/controllers/pages_controller.rb

class PagesController < ApplicationController
  before_action :require_login, only: [:new]
  
  def index
  end

  def new
  end
end

Trong đoạn mã trên, chúng tôi đang sử dụng trình trợ giúp Xóa, require_login , để hạn chế quyền truy cập vào new hoạt động. Để xem nó hoạt động như thế nào, hãy khởi động máy chủ rails của bạn bằng cách chạy rails server từ thiết bị đầu cuối của bạn. Trỏ trình duyệt của bạn tới https://locahost:3000/pages/new và nó sẽ chuyển hướng bạn đến trang đăng nhập.

Giải phóng mặt bằng cũng cung cấp các ràng buộc định tuyến có thể được sử dụng để kiểm soát quyền truy cập.

#config/routes.rb

Rails.application.routes.draw do
  constraints Clearance::Constraints::SignedOut.new do
    root to: 'pages#index'
  end

  constraints Clearance::Constraints::SignedIn.new do
    root to: "pages#new', as: :signed_in_root
  end
end

Trong đoạn mã trên, một tuyến đường khác đã được tạo cho người dùng được xác thực.

Ghi đè mặc định giải phóng mặt bằng

Rất nhiều điều xảy ra ở hậu trường khi bạn bắt đầu sử dụng Clearance, những thứ bạn không thể nhìn thấy. Có thể có lúc bạn muốn tùy chỉnh mọi thứ theo cách khác nhau, tùy thuộc vào đặc điểm kỹ thuật của ứng dụng của bạn. Phép xóa cho phép bạn ghi đè cấu hình mặc định đi kèm.

Để ghi đè (hoặc tạo) các tuyến thanh lý, hãy chạy lệnh này từ thiết bị đầu cuối của bạn.

rails generate clearance:routes

Tệp định tuyến của bạn bây giờ sẽ trông giống như sau:

#config/routes.rb

Rails.application.routes.draw do
  resources :passwords, controller: "clearance/passwords", only: [:create, :new]
  resource :session, controller: "clearance/sessions", only: [:create]

  resources :users, controller: "clearance/users", only: [:create] do
    resource :password,
      controller: "clearance/passwords",
      only: [:create, :edit, :update]
  end

  get "/sign_in" => "clearance/sessions#new", as: "sign_in"
  delete "/sign_out" => "clearance/sessions#destroy", as: "sign_out"
  get "/sign_up" => "clearance/users#new", as: "sign_up"
  root to: "pages#index"
  resources :pages, only: :new
end

Lệnh này cũng sẽ đặt config.routes đặt thành false trong config/initializers/clearance.rb của bạn tập tin. Điều này có nghĩa là tệp tùy chỉnh vừa được tạo sẽ được sử dụng.

Để tạo các chế độ xem để sửa đổi, hãy chạy:

rails generate clearance:views

Một số tệp sẽ được tạo bao gồm:

  app/views/passwords/create.html.erb
  app/views/passwords/edit.html.erb
  app/views/passwords/new.html.erb
  app/views/sessions/_form.html.erb
  app/views/sessions/new.html.erb
  app/views/users/_form.html.erb
  app/views/users/new.html.erb
  config/locales/clearance.en.yml

Bạn sẽ thấy lời nhắc trong thiết bị đầu cuối yêu cầu ghi đè app/views/layouts/application.html.erb của bạn tập tin. Chọn tùy chọn bạn muốn.

Bố cục

Theo mặc định, Clearance sử dụng bố cục mặc định của ứng dụng của bạn. Nếu bạn muốn thay đổi bố cục mà Clearance sử dụng khi hiển thị các chế độ xem của nó, chỉ cần chỉ định bố cục trong trình khởi tạo.

Clearance::PasswordsController.layout "my_passwords_layout"
Clearance::SessionsController.layout "my_sessions_layout"
Clearance::UsersController.layout "my_admin_layout"

Phương pháp người trợ giúp

Giải phóng mặt bằng cung cấp cho bạn các phương thức trợ giúp có thể được sử dụng trong controllers của bạn , viewshelpers . Các phương thức này bao gồm signed_in? , signed_out?current_user . Ví dụ:

<% if signed_in? %>
  <%= current_user.email %>
  <%= button_to "Sign out", sign_out_path, method: :delete %>
<% else %>
  <%= link_to "Sign in", sign_in_path %>
<% end %>

Kết luận

Việc xác thực có rất nhiều thứ để cung cấp cho bạn khi nói đến xác thực, vì vậy hãy nhớ thử nó trong dự án tiếp theo của bạn. Bạn có thể tìm hiểu thêm bằng cách xem trang GitHub.