[RUBY] Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 17. Fügen Sie Administratorrechte hinzu

Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in den Richtlinieneinstellungen von Rails 6 # 16

Bereiten Sie Administratorrechte vor

Bei der vorherigen Implementierung kann nur das Poster den Beitrag bearbeiten oder löschen. Ich werde es jedoch erweitern, damit jeder Beiträge bearbeiten / löschen kann, wenn er als Administrator angemeldet ist.

Fügen Sie dazu Ihrem Benutzermodell eine Admin-Spalte hinzu.

$ rails g migration AddAdminToUsers admin:boolean

db/migrate/xxxxxxxxxxxxxx_add_admin_to_users.rb


# frozen_string_literal: true

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

Übrigens habe ich den Test bis jetzt nach der Implementierung der Funktion geschrieben, aber ich denke, dass ich das grundlegende Verhalten von pundit verstehe, also werde ich es zuerst aus dem Test schreiben.

Da der Test, der nicht bearbeitet und gelöscht werden kann, wenn Sie als anderer Benutzer ohne Administratorrechte angemeldet sind, bereits geschrieben wurde,

Lassen Sie uns implementieren. Genau genommen ist es perfekt, sowohl den Richtlinientest als auch den Anforderungstest zu implementieren, aber hier werden wir nur die Richtlinie implementieren.

Wenn Sie möchten, schauen Sie sich nicht das hier geschriebene Beispiel an. Wenn Sie jedoch versuchen, es selbst zu implementieren und zu vergleichen, ist es üblich, Code zu schreiben. Versuchen Sie es also bitte.

Bearbeiten von post_policy_spec.rb

spec/policies/post_policy_spec.rb


...
 RSpec.describe PostPolicy, type: :policy do
   let(:user) { create(:user) }
+  let(:admin_user) { create(:user, admin: true) }
   let(:post) { create(:post) }

...
     it "Nicht erlaubt, wenn angemeldet, aber ein anderer Benutzer" do
       expect(subject).not_to permit(user, post)
     end
+    it "Erlaubt, wenn Sie als Administrator angemeldet sind" do
+      expect(subject).to permit(admin_user, post)
+    end
...

spec/factories/posts.rb


...
     remember_created_at { nil }
     name { "MyString" }
     tokens { nil }
+    admin { false }
   end
...

Verschieben Sie nach der bisherigen Implementierung rubocop und rspec und überprüfen Sie. Ich habe die Richtliniendatei noch nicht implementiert, daher ist der Test Moos.

Umsetzung der Politik

Erstellen Sie zunächst in application_policy.rb eine private Methode, die feststellt, dass Sie Administrator sind.

app/policies/application_policy.rb


...
   private

   def mine?
     @record.user == @user
   end
+
+  def admin?
+    @user.present? && @user.admin?
+  end
+

Alles, was übrig bleibt, ist, die beiden Beurteilungen von update? Destroy? In post_policy.rb zu ändern.

app/policies/post_policy.rb


   def update?
-    mine?
+    mine? || admin?
   end
 
   def destroy?
-    mine?
+    mine? || admin?
   end

Das ist es!

Erstellen Sie ganz einfach einen Administrator mit Eigenschaften

Dies ist ein kleiner, dünner Artikel. Berühren Sie also factoryBot, um das Erstellen von Administratorbenutzern zu vereinfachen.

spec/factories/users.rb


     name { "MyString" }
     tokens { nil }
     admin { false }
+
+    trait :admin do
+      admin { true }
+    end
   end

spec/policies/post_policy_spec.rb


 RSpec.describe PostPolicy, type: :policy do
   let(:user) { create(:user) }
-  let(:admin_user) { create(:user, admin: true) }
+  let(:admin_user) { create(:user, :admin) }
   let(:post) { create(:post) }

Wie wäre es damit, rspec damit zu betreiben? Wenn Sie fehlerfrei schreiben können, sollten Sie den Test bestehen.

Wie Sie sehen können, kann das Merkmal verwendet werden, indem es als Alias an das zweite Argument übergeben wird, z. B. "create" von factoryBot. Es gibt wenig Nutzen und Sinnlosigkeit, wenn Sie nur das Admin-Flag setzen. Wenn es jedoch eine Spalte gibt, für die im Fall eines Admin-Benutzers ein Anfangswert als Satz festgelegt werden soll, werden bei jedem Erstellen mehrere Spalten hinzugefügt Sie müssen den Anfangswert nicht festlegen.

Bitte verwenden Sie alle Mittel.

Fortsetzung

Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 18 ・ Implementierung des Endbenutzer-Controllers [Zur Serialisierungstabelle]

Recommended Posts

Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 17. Fügen Sie Administratorrechte hinzu
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6 # 13 Grant-Authentifizierungsheader
Einführung des Experten Nr. 15 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 14 Seed. Anzeige der Ausführungszeit
# 16 Richtlinieneinstellung zum Erstellen einer Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6
# 8 Seed-Implementierung zum Erstellen einer Bulletin Board-API mit Zertifizierungsautorisierung in Rails 6
Erstellen Sie eine Bulletin-Board-API mit Zertifizierung und Autorisierung mit Rails 6 # 1 Environment Construction
Einführung des Serializers Nr. 9 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 12 Assoziation von Benutzer und Beitrag
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 6. Zeigen Sie, erstellen Sie die Implementierung
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 2 Einführung in Git und Rubocop
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung im Rails 6 # 7-Update und zerstören Sie die Implementierung
Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 11. Benutzermodelltest und Validierung hinzugefügt
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Fügen Sie mit Gradle ein Projekt in einen beliebigen Ordner ein
So erstellen Sie eine API mit GraphQL und Rails
[Hinweis] Erstellen Sie eine Python3-Umgebung mit Docker in EC2
[So fügen Sie ein Video mit Rails in haml ein]
Build Rails (API) x MySQL x Nuxt.js Umgebung mit Docker
[Ruby on Rails] Fügen Sie eine Spalte mit externen Schlüsselbeschränkungen hinzu
Ich bin auf einen Typen mit zwei Punkten in Rails gestoßen
So richten Sie einen Proxy mit Authentifizierung in Feign ein