[RUBY] [Note] Comment utiliser Rails 6 Devise + cancancan

introduction

Après avoir créé un modèle utilisateur (authentification) à l'aide de devise Ajout de cancancan pour permettre l'autorisation.

Enregistrez le processus sous forme de mémorandum.

Ajoutez la gemme de devise.

・
・
・
gem 'devise'

Installation du bundle.

$bundle install

Installez l'appareil.

$rails generate devise:install

Vérifiez s'il y a un paramètre.

config/environments/development.rb


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

Ajouter un index de page.

config/routes.rb


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

Ajoutez ce qui suit.

app/views/layouts/application.html.erb



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

Installer View.

$ rails g devise:views

Ce qui suit est créé.

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

Créez un modèle. Cette fois, nous allons créer un modèle utilisateur.

$ rails g devise user

Le modèle suivant est créé.

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

Les éléments suivants sont créés en même temps.

config/application.rb


config.i18n.default_locale = :ja

Ce qui suit est également fait.

config/routes.rb


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

Après avoir créé le modèle, il sera reflété dans la base de données.

rails db:migrate

Puisqu'il n'y a pas encore de vue de l'index de la page, je vais le créer.

$ rails g controller Pages index

En passant, vous pouvez modifier le chemin en créant une étendue dans routes.rb.

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

Cette volonté http://localhost:3000/login La page de connexion s'affiche lorsque vous y accédez.

Bien sûr, la page de connexion est affichée même avec la valeur par défaut / users / sign_in, supprimez-la si nécessaire.

routes.rb


 devise_for :users, skip: [:sessions]

Les paramètres de l'appareil sont terminés.

installation cancancan

Ensuite, installez cancancan. C'est ce qu'on appelle l'autorisation, selon l'utilisateur Cela signifie accorder des droits d'accès. C'est la différence entre un administrateur système et un utilisateur général.

gem 'cancancan'

Installation du bundle.

$bundle install

La classe Ability est créée.

rails g cancan:ability

Il s'agit de la valeur par défaut de la classe Ability.

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

Changer pour:

# 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 Sans ce qui précède, une erreur s'est produite lors du fonctionnement en tant qu'utilisateur invité.

if user.admin? ← Qu'est-ce que admin? Quelqu'un m'a demandé.

def initialize(user) user ||= User.new can :read, :all Quand le modèle Ability est appelé Si vous êtes connecté en tant que valeur initiale, l'utilisateur est placé dans la variable et si vous n'êtes pas connecté, l'utilisateur invité est affecté à la variable. Ensuite, cela signifie que l'autorisation de lecture est donnée à la variable utilisateur. Cela signifie que tous les utilisateurs ont des privilèges de lecture.

Veuillez noter que l'autorisation de lecture n'est pas liée à CRUD. Cela signifie que la page peut être lue, cela ne signifie pas que vous pouvez l'obtenir, et vous pouvez le faire en programmant la méthode create séparément.

if user.admin? 
  can :manage,  :all

Il s'agit d'un programme à exécuter si true est entré dans la colonne admin créée dans le modèle User. En d'autres termes, il s'agit d'un utilisateur avec des privilèges d'administrateur.

Ajoutez ce qui suit à la page d'affichage de l'index de page.

app/views/pages/index.html.erb


<h1>Pages#index</h1>
<p>Find me in app/views/pages/index.html.erb</p>
  <%= link_to "Effacer", 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 %> Si l'utilisateur actuellement connecté dispose d'une autorisation de mise à jour, le contenu sera affiché.

<% if can? :read, current_user %> Si l'utilisateur connecté a l'autorisation de lecture, le contenu sera affiché.

Cela signifie que · · ·

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

Dans ce qui précède, l'administrateur n'est pas dans le modèle utilisateur, que dois-je faire? je pense que ce sera Il sera ajouté.

$rails g migration AddAdminToUser admin:boolean

Ce qui suit est créé par défaut par défaut: ajoutez "faux".

Sur la page d'affichage, ne créez pas une vue qui sélectionne admin, mais créez par défaut un utilisateur avec admin = false. Ici, l'administrateur est créé intentionnellement du côté de la gestion.

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

Émigrer

$rails g migrate

Vérifiez le schéma de base de données.

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/ Créez un utilisateur général avec.

utilisateur admin Créez comme suit.

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

Ceci termine la procédure, En fait pour les utilisateurs généraux et les utilisateurs administrateurs respectivement Accédez à l'index de la page.

Étant donné que les utilisateurs généraux n'ont que les droits de lecture, la lecture peut être affichée.

L'utilisateur Admin a des privilèges de gestion (a tous les privilèges), donc la lecture et la mise à jour peuvent être affichées respectivement.

Recommended Posts

[Note] Comment utiliser Rails 6 Devise + cancancan
[Rails] Comment utiliser l'appareil (Remarque)
[Rails] Comment utiliser la "devise" des gemmes
[Rails] Comment utiliser enum
[Rails] Comment utiliser enum
Comment utiliser la jonction de rails
[Rails] Comment utiliser la validation
[Rails] Comment utiliser authenticate_user!
[Rails] Comment utiliser Scope
[rails] Comment utiliser la méthode d'assistance de devise before_action: authenticate_user!
[Rails] Comment utiliser les messages flash
Comment utiliser Ruby on Rails
[Introduction aux rails] Comment utiliser le rendu
Comment utiliser MySQL dans le didacticiel Rails
Comment utiliser la classe Java Scanner (Remarque)
[Ruby on Rails] Comment utiliser redirect_to
[Rails] Comment utiliser video_tag pour afficher des vidéos
Ruby: CSV :: Comment utiliser la note de tableau
[Rails] Comment utiliser la méthode d'assistance, confimartion
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
[Rails] Comment traduire la devise en japonais
Comment utiliser Map
Comment écrire des rails
Comment utiliser rbenv
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
Comment désinstaller Rails
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
[Rails] Comment utiliser les boîtes de sélection dans Ransack
Comment utiliser les rails g échafaudage, fonctions, précautions
Remarquez comment utiliser Swift Super Basic TableView
Comment utiliser le contrôle segmenté et les points à noter
Comment utiliser JQuery dans Rails 6 js.erb
[Rails] Comment utiliser PostgreSQL dans l'environnement Vagrant
[rails] Comment publier des images
Comment utiliser l'API Chain