Frage

Ich arbeite an einer Rails-Web-Anwendung, und es wird derzeit von etwa 20 Benutzern verwendet werden.

Einige Teile der Anmeldung sind nur zugänglich, von einigen Benutzern, so haben wir bereits eine Basis-Autorisierungs-Rahmen geschaffen, die ich das acts_as_authenticated Plugin realisiert.

Die Benutzerrechte auf abhängen, welche Abteilung sie arbeiten in, so zum Beispiel Verwaltung Zugriff auf alle Teile der Anwendung hat, während nur Zugriff auf die rechnungslegungsbezogenen Teile hat Buchhaltung und Vertrieb hat nur Zugriff auf umsatzbezogene Teile etc.

Auf der anderen Seite sehen die Benutzer die Links zu Aktionen, für die sie unsufficient Privilegien haben. Siehe zum Beispiel des in der Verkaufsabteilung einen Link zu den Finanzdaten im Hauptmenü, aber wenn sie darauf klicken, passiert nichts. Dies ist so, AFAIK, weil es keine effiziente Möglichkeit ist acts_as_authenticated Abfrage mit Benutzerrechten an.

Ich möchte dies auf zwei Arten geändert werden:

  1. Ich mag mehr feinkörnige Zulassung einzuführen. Derzeit ist die Ermächtigung auf Controller-Ebene erfolgen. Ich mag diese Ebene an der Aktion oder Modell zu tun. Zum Beispiel möchte ich die in der Verkaufsabteilung der Lage sein, zu erstellen und zu aktualisieren Zahlungen, aber nicht gelöscht werden.

  2. Ich mag Benutzerberechtigungen können effizient abzufragen, so kann ich aus der Schnittstelle.

  3. unnötig (und verwirrend) Links entfernen

Was denken Sie, der eleganteste Weg, dies zu implementieren?

Rails-spezifische Antworten sind nicht nötig, ich will nur wissen, wie dies sollte in einer datengesteuerten Anwendung implementiert werden.

Schließlich ist hier, wie es implementiert derzeit:

def authorized?
  current_user.role.foo? or current_user.role.bar?
end

Und hier ist meine erste Idee, die ich denke, ist nicht der beste Weg, dies zu lösen:

+------------+------------+---------+
| department | controller | action  |
+------------+------------+---------+
| accounting | payments   | index   |
| accounting | payments   | new     |
| accounting | payments   | create  |
| accounting | payments   | edit    |
| accounting | payments   | update  |
| accounting | payments   | destroy |
| sales      | payments   | new     |
| sales      | payments   | create  |
| sales      | payments   | edit    |
| sales      | payments   | update  |
+------------+------------+---------+

oder

+------------+----------+-------+--------+------+--------+--------+
| department | model    | list  | create | read | update | delete |
+------------+----------+-------+--------+------+--------+--------+
| accounting | payments | TRUE  | TRUE   | TRUE | TRUE   | TRUE   |
| sales      | payments | FALSE | TRUE   | TRUE | TRUE   | FALSE  |
+------------+----------+-------+--------+------+--------+--------+
War es hilfreich?

Lösung

Das Grundkonzept der Genehmigung, wie ich es verstehe, ist eine Rolle. Die Rolle kann verschiedene Dinge ausdrücken:

  1. Beziehung eines Benutzers auf das System als Ganzes (z. B. ein Admin des Systems sein)
  2. Beziehung eines Benutzers zu einer Art von Unternehmen (z. B. ein Moderator von Kommentaren sein)
  3. Beziehung eines Benutzers zu einem gewissen bestimmten Einheit (z. B. der Besitzer einer Ressource sein)
  4. einig andere komplexe Beziehung (z. B. ein Freund von einem Benutzer zu sein, dass ein Besitzer einer Ressource ist)
  5. , dass Benutzer einige Attribute (e) oder es reagiert auf einige Nachricht in einer bestimmten Art und Weise (z. B. ein Teenager sein)

Ein wirklich feinkörniges Berechtigungssystem sollten Ihnen ermöglichen, Rolle für einen Benutzer auf einen der oben genannten Kriterien zu definieren. Darüber hinaus sollte es Ihnen erlaubt, mehr als eine Rolle für einen Benutzer einzustellen. (Die einfachsten Formen der Genehmigung Plugins für Rails in der Regel können Sie nur die erste Art von Rollen definieren und nur eine Rolle für einen Benutzer.)

Der andere Teil des authoriation ist ein Mechanismus, welche (oder auch nicht ausgeführt werden) auszuführen Teil Code entscheidet auf der Grundlage der Tatsache, ob ein Benutzer in eine Rolle paßt (Satz von Rollen) oder nicht. Um diesen Mechanismus anwenden, müssen wir die Punkte, wo die Genehmigung stattfinden soll, und wählen Sie Rollen, für die der Code sollte oder sollte nicht ausgeführt werden.

Die Art und Weise, die für mich in Rails funktioniert, ist Rolle auf Modellebene zu definieren und Autorisierungsmechanismus (Einstellung erlaubt Rollen für Teile des Codes zu verlassen, dass ich autorisiert werden soll, und zu fragen, ob aktuelle Benutzer die Rolle hat, die erlaubt ist führen Sie das Teil) vollständig für Controller / Ansichten.

Dazu verwende ich gezwickt Schienen-Autorisierungs-Plugin, das alle Möglichkeiten hat erwähnte ich gerade gebaut rechts in (verschiedene Arten von Rollen, viele Rollen für einen Benutzer, Autorisierung auf Controller und Ansichtsebene).

Andere Tipps

Sie müssen den Begriff der ‚Function Points‘ oder ‚Eigenschaften‘ in das Modell als Kontrollpunkt für den Zugriff auf einzuführen; ein ‚Merkmal‘ kann eine optionale ‚übergeordnete Funktion‘ hat eine Hierarchie zu bilden. Sie erhalten zu entscheiden, was ist und ist kein Merkmal, und programmatisch für Berechtigungen überprüfen. Dies sollte auch ermöglichen es Ihnen für Feature-Level-Zugriff zu prüfen, bevor ein Menü zeichnen, so dass die Benutzer nie Links zu Seiten, sehen sie für den Zugriff nicht erlaubt.

eine ähnliche Situation / Lösung wird beschrieben

Ihre beiden Vorschläge, sieht die erste Option ein wenig besser, da es Sie Aktionen hinzufügen können, die nicht auf Modellebene Aktionen sein kann. Ich schätze, dass Sie in einen Fall ausgeführt werden, wo das zweite Modell nicht ganz genug zu tun, und Sie werden müssen entweder das Schema ändern oder in Ihrer App (ex Beregnung Berechtigungen Logik starten. „Benutzer ohne‚schaffen‘Zugang auch nicht Methode xxx ")

run

Ich denke, der Grund, warum die Lösung nicht sehr trocken sieht ist, dass es die Wiederholung ist:

  1. In den Abteilungsnamen und
  2. In der Abteilung Fähigkeiten

In Bezug auf # 1, wäre es sinnvoll, eine Abteilung Tabelle zu erstellen, und jeder Abteilung eine Id geben.

In Bezug auf # 2, ich mit dem ersten Kommentar zustimmen. Sie können sich wahrscheinlich um die verschiedenen Controller und Aktionen in funktionelle Gruppen clustern und dann eine viele zu viele Beziehung (Zuordnungstabelle) zwischen Benutzern und Funktionen einstellen. Funktionen hätten dann eine Eins-zu-viele-Beziehung mit dem, was Aktionen / controllers sie ermöglichen. Dies würde man mit minimaler Wiederholung lassen, sagen Dinge wie: „Buchhaltung und Vertrieb der Lage sein sollten all finanziellen Tabellen zu lesen.“

scroll top