[RUBY] [Hinweis] Verwendung von Rails 6 Devise + Cancancan

Einführung

Nach dem Erstellen eines Benutzermodells (Authentifizierung) mit devise Cancancan hinzugefügt, um die Autorisierung zu ermöglichen.

Protokollieren Sie den Prozess als Memorandum.

Fügen Sie den Edelstein hinzu.

・
・
・
gem 'devise'

Bundle-Installation.

$bundle install

Installieren Sie das Gerät.

$rails generate devise:install

Überprüfen Sie, ob eine Einstellung vorhanden ist.

config/environments/development.rb


・
・
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

Seitenindex hinzufügen.

config/routes.rb


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

Fügen Sie Folgendes hinzu.

app/views/layouts/application.html.erb



<body>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
・
・
</body>

Installieren Sie View.

$ rails g devise:views

Folgendes wird erstellt.

app/views/devise/unlocks/new.html.erb app/views/devise/shared/_links.html.erb app/views/devise/shared/_error_messages.html.erb app/views/devise/sessions/new.html.erb app/views/devise/registrations/new.html.erb app/views/devise/registrations/edit.html.erb app/views/devise/passwords/new.html.erb app/views/devise/passwords/edit.html.erb app/views/devise/mailer/unlock_instructions.html.erb app/views/devise/mailer/reset_password_instructions.html.erb app/views/devise/mailer/password_change.html.erb app/views/devise/mailer/email_changed.html.erb app/views/devise/mailer/confirmation_instructions.html.erb app/views/devise/confirmations/new.html.erb

Erstellen Sie ein Modell. Dieses Mal erstellen wir ein Benutzermodell.

$ rails g devise user

Das folgende Modell wird erstellt.

app/models/user.rb


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end

Folgendes wird gleichzeitig erstellt.

config/application.rb


config.i18n.default_locale = :ja

Das Folgende wird ebenfalls gemacht.

config/routes.rb


ails.application.routes.draw do
devise_for :users
・
・
end

Nach dem Erstellen des Modells wird es in der Datenbank angezeigt.

rails db:migrate

Da es noch keine Ansicht des Seitenindex gibt, werde ich sie erstellen.

$ rails g controller Pages index

Nebenbei können Sie den Pfad ändern, indem Sie einen Bereich in route.rb erstellen.

routes.rb


  devise_scope :user do
    get 'login', to: 'devise/sessions#new'
    post 'login', to: 'devise/sessions/#create'
    delete 'logout', to: 'devise/sessions#destroy' 
  end

Dieser Wille http://localhost:3000/login Die Anmeldeseite wird beim Zugriff angezeigt.

Natürlich wird die Anmeldeseite auch mit dem Standardwert / users / sign_in angezeigt. Löschen Sie sie daher bei Bedarf.

routes.rb


 devise_for :users, skip: [:sessions]

Die Geräteeinstellungen sind abgeschlossen.

cancancan Installation

Als nächstes installieren Sie cancancan. Dies wird je nach Benutzer als Autorisierung bezeichnet Es bedeutet, Zugriffsrechte zu gewähren. Dies ist der Unterschied zwischen einem Systemadministrator und einem allgemeinen Benutzer.

gem 'cancancan'

Bundle-Installation.

$bundle install

Die Fähigkeitsklasse wird erstellt.

rails g cancan:ability

Dies ist die Standardeinstellung für die Fähigkeitsklasse.

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    #   user ||= User.new # guest user (not logged in)
    #   if user.admin?
    #     can :manage, :all
    #   else
    #     can :read, :all
    #   end
    #
    # The first argument to `can` is the action you are giving the user
    # permission to do.
    # If you pass :manage it will apply to every action. Other common actions
    # here are :read, :create, :update and :destroy.
    #
    # The second argument is the resource the user can perform the action on.
    # If you pass :all it will apply to every resource. Otherwise pass a Ruby
    # class of the resource.
    #
    # The third argument is an optional hash of conditions to further filter the
    # objects.
    # For example, here the user can only update published articles.
    #
    #   can :update, Article, :published => true
    #
    # See the wiki for details:
    # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
  end
end

Ändern:

# frozen_string_literal: true

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    can :read,  :all

    if user.admin? 
      can :manage,  :all

    end



    # Define abilities for the passed in user here. For example:
    #
    #   user ||= User.new # guest user (not logged in)
    #   if user.admin?
    #     can :manage, :all
    #   else
    #     can :read, :all
    #   end
    #
    # The first argument to `can` is the action you are giving the user
    # permission to do.
    # If you pass :manage it will apply to every action. Other common actions
    # here are :read, :create, :update and :destroy.
    #
    # The second argument is the resource the user can perform the action on.
    # If you pass :all it will apply to every resource. Otherwise pass a Ruby
    # class of the resource.
    #
    # The third argument is an optional hash of conditions to further filter the
    # objects.
    # For example, here the user can only update published articles.
    #
    #   can :update, Article, :published => true
    #
    # See the wiki for details:
    # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
  end
end

user ||= User.new Ohne das oben Gesagte ist beim Betrieb als Gastbenutzer ein Fehler aufgetreten.

if user.admin? ← Was ist admin? Ich wurde gefragt.

def initialize(user) user ||= User.new can :read, :all Wenn das Fähigkeitsmodell aufgerufen wird Wenn Sie standardmäßig angemeldet sind, fügen Sie diesen Benutzer in die Variable ein. Wenn Sie nicht angemeldet sind, wird der Gastbenutzer der Variablen zugewiesen. Dann bedeutet dies, dass der Benutzervariablen Leseberechtigung erteilt wird. Dies bedeutet, dass alle Benutzer über Leseberechtigungen verfügen.

Bitte beachten Sie, dass die Leseberechtigung nicht an CRUD gebunden ist. Dies bedeutet, dass die Seite gelesen werden kann, nicht, dass Sie sie erhalten können, und Sie können dies tun, indem Sie die Erstellungsmethode separat programmieren.

if user.admin? 
  can :manage,  :all

Dies ist ein Programm, das ausgeführt werden soll, wenn true in die im Benutzermodell erstellte Admin-Spalte eingegeben wird. Mit anderen Worten, es ist ein Benutzer mit Administratorrechten.

Fügen Sie dem Index Seite anzeigen von Seite # Folgendes hinzu.

app/views/pages/index.html.erb


<h1>Pages#index</h1>
<p>Find me in app/views/pages/index.html.erb</p>
  <%= link_to "Löschen", logout_path, method: :delete %>

<% if can?  :update, current_user %>
  <h1>update</h1>

<% end %>

<% if can? :read, current_user %>
  <h1>read</h1>
<% end %>

<% if can? :update, current_user %> Wenn der aktuell angemeldete Benutzer über eine Aktualisierungsberechtigung verfügt, wird der Inhalt angezeigt.

<% if can? :read, current_user %> Wenn der angemeldete Benutzer über eine Leseberechtigung verfügt, wird der Inhalt angezeigt.

Es bedeutet, dass · · ·

db/schema.rb


  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.boolean "admin", default: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

Oben befindet sich admin nicht im Benutzermodell. Was soll ich tun? Ich denke, es wird Es wird hinzugefügt.

$rails g migration AddAdminToUser admin:boolean

Folgendes wird standardmäßig erstellt Standard: Fügen Sie "false" hinzu.

Erstellen Sie auf der Ansichtsseite keine Ansicht, in der admin ausgewählt ist, sondern erstellen Sie standardmäßig einen Benutzer mit admin = false. Hier wird der Administrator absichtlich auf der Managementseite erstellt.

db/migrate/20200522114428_add_admin_to_users.rb



class AddAdminToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :admin, :boolean, default: "false"
  end
end

Wandern

$rails g migrate

Überprüfen Sie das DB-Schema.

db/schema.rb


 create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.boolean "admin", default: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

http://localhost:3000/ Erstellen Sie einen allgemeinen Benutzer mit.

Administrator Erstellen Sie wie folgt.

$user =User.new(id: xx, email: "xxx@yyy", password: "xxxx", admin: true)

Damit ist der Vorgang abgeschlossen. Eigentlich für allgemeine Benutzer bzw. Administratoren Gehen Sie zum Seitenindex.

Da allgemeine Benutzer nur Leseberechtigung haben, kann Lesen angezeigt werden.

Der Administrator verfügt über Verwaltungsberechtigungen (verfügt über alle Berechtigungen), sodass Lese- und Aktualisierungsrechte angezeigt werden können.

Recommended Posts

[Hinweis] Verwendung von Rails 6 Devise + Cancancan
[Schienen] Verwendung von Geräten (Hinweis)
[Rails] Wie man Edelstein "devise" benutzt
[Rails] Verwendung von Enum
[Rails] Verwendung von Enum
Verwendung von Rails Join
[Rails] Verwendung der Validierung
[Rails] So verwenden Sie authenticate_user!
[Schienen] Verwendung von Scope
[Rails] So verwenden Sie die Hilfsmethode von devise before_action: authenticate_user!
[Rails] Verwendung von Flash-Nachrichten
Verwendung von Ruby on Rails
[Einführung in Rails] Verwendung von Render
Verwendung von MySQL im Rails-Tutorial
Verwendung der Java Scanner-Klasse (Hinweis)
[Ruby on Rails] Verwendung von redirect_to
[Rails] Verwendung von video_tag zum Anzeigen von Videos
Ruby: CSV :: Verwendung von Table Note
[Rails] Verwendung der Hilfsmethode, Confimartion
Verwendung von credentials.yml.enc aus Rails 5.2
[Rails] Wie man Geräte ins Japanische übersetzt
Verwendung von Map
Wie schreibe ich Rails
Wie benutzt man rbenv?
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
So deinstallieren Sie Rails
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
[Rails] Verwendung von Auswahlfeldern in Ransack
Verwendung von Schienen g Gerüst, Funktionen, Vorsichtsmaßnahmen
Beachten Sie, wie Sie Swift Super Basic TableView verwenden
Verwendung von Segmented Control und zu notierenden Punkten
Verwendung von JQuery in Rails 6 js.erb
[Rails] Verwendung von PostgreSQL in einer Vagrant-Umgebung
[Schienen] Wie poste ich Bilder?
Verwendung der Ketten-API