Ich hatte großen Erfolg mit der state_machine und liebe die Klassenmethoden, die es dynamisch durch nur ein paar Zeilen Code erstellt.Implementieren mehrerer Benutzerrollen
Allerdings bin ich mir nicht sicher, wie ich mit dem System fortfahren soll, das ich erstelle. Ich entwickle gerade ein System, in dem Benutzer viele Rollen haben. Es ist also nicht einfach, einen Benutzer zu haben, dessen Status von unbestätigt bis und dann möglicherweise admin geht.
Ein Benutzer hat jetzt viele Rollen und kann ein Potential, ein Radfahrer, ein coorinator, ein Krippe, ein Forum Admin, ein Shop Admin, ein Super-Administrator sein und eine Spendenaktion.
So geht die Hierarchie wie folgt aus:
superadmin
Forum Admin, store Admin
Radfahrer, Koordinator, Krippe, Fundraiser
Potential
Allerdings wird eine Zustandsmaschine es hier nicht geschnitten, weil es durchaus möglich ist, dass ein Benutzer alle oben genannten Rollen in der gleichen Zeit haben kann.
ich meine eigene Klasse Methoden wie diese Umsetzung Art etwas state-Maschine zu emulieren:
class User < ActiveModel::Base
has_many :jobs
has_many :roles, through: :jobs
def role_array
self.roles.pluck(:role)
end
def has_role?(role)
role_array.include?(role)
end
# checking
def is_superadmin?
role_array.include?('superadmin')
end
# changing
def add_role(role)
self.update_attributes(accepted_at: Time.now) if self.is_only_potential?
self.user_roles.create(role_id: Role.find_by(role: role).id) if !self.has_role?(role)
end
def remove_role(role)
self.user_roles.find_by(role_id: Role.find_by(role: role).id).destroy if self.has_role?(role)
end
def make_superadmin!
add_role('superadmin')
end
def denounce_superadmin!
remove_role('superadmin')
end
end
Und es ist nur ein bisschen ein faff. Also meine Fragen sind:
1) mache ich es richtig? Wie würden Sie mit Benutzern mit mehreren Rollen umgehen?
2) Auch wenn ich es richtig mache, würde Ich mag ein state_machine-esque DSL zu schaffen, so dass, wenn ich brauche eine neue Rolle zu erstellen, sagen wir mal ‚Läufer‘, kann ich nur so etwas tun Dies in meinem Modell:
class User < ActiveModel::Base
has_many :jobs
has_many :roles, through: :jobs
multiroles initial: :potential do
roles [:superadmin, :forum_admin, :store_admin, :cyclist, :coordinator, :manager, :fundraiser, :potential]
# dynamically creates the above methods for getting and setting for all roles
end
Wie soll ich diese multirole Methode erstellen? Inside lib
? bereit, als mein erster Edelstein abgepackt zu werden?
Ich habe keine Ahnung, wie dynamisch Methoden zu schaffen, aber ich mag :)
nur einen Gedanken starten, vielleicht die multiroles
Methode dynamisch alle Rollen über Roles.all
bekommen konnte und automatisch die oben genannten Methoden hinzufügen! Vielleicht kümmern Sie sich auch um die has_many :jobs
has_many :roles, through: :jobs
Auch, wie sollte ich diese Rollen authentifizieren? Ich tue dies derzeit in einem vor Block in meinem Controller:
def only_superadmins
redirect_to root_url if !current_user.has_role?('superadmin')
end
ich auch ein paar dieser Methoden in meiner Anwendung Controller verfügen, only_superadmins
, only_cyclists
ect und ich nenne sie über die before_method
Verfahren in verschiedenen Teil Controller.
Ist das okay? Sollte ich Cancan oder etwas verwenden?
Wenn ich es richtig mache, frage ich mich, wie ich diese Methoden dynamisch mit meinem Edelstein erstellen soll. Ich denke, etwas in dieser Richtung:
class panel_controller < ApplicationController
allowed_roles [:super_admin, :forum_admin, :store_admin]
end
und die allowed_roles Methode, um diese Methoden So erstellen würde
def allowed_roles(role_array)
role_array.each do |role|
define "only_#{role.to_s}s" do |arg|
redirect_to root_url if !current_user.has_role?(arg.to_s)
end
end
end
das würde diese Methoden programmatisch erstellen:
def only_super_admins
redirect_to root_url if !current_user.has_role?('super_admin')
end
def only_forum_admins
redirect_to root_url if !current_user.has_role?('forum_admin')
end
def only_store_admins
redirect_to root_url if !current_user.has_role?('store_admin')
end
Während ich don‘ Warum das nicht funktionieren würde, finde ich nicht so effizient.
Vielleicht allowed_roles
sollte wie folgt aussehen:
def allowed_roles(wanted_roles)
redirect_to root_url unless (current_user.role_array & wanted_roles).empty? # it's ONLY empty when any of the current_user roles exists in the wanted_roles array
end
Ich möchte nur einige Hinweise wirklich :)
Wie kann ich ein Juwel erstellen die allowed_roles
Methode zur Verfügung, an die Controller zu machen und multiroles
zur Verfügung das Benutzermodell?
Kann cancan
mehrere Rollen wie das verwalten? Soll ich das nur benutzen?
Vielleicht CanCanCan https://github.com/cancancommunity/cancancan anstelle von CanCan verwenden. – Bjoernsen