2014-02-20 8 views
5

HintergrundAllgemein/Phalcon - ACL und Datenbank-Speicher

ich zur Zeit auf einer Phalcon Anwendung arbeiten. Die Anwendung selbst ist relativ einfach, aber ich benutze sie als ein Werkzeug, um etwas fortgeschrittenere Konzepte und Techniken zu lernen.

Ich habe meine Homebrew-ACL (Access-Control-Liste) Lösung aufgegeben und für die ACL in Phalcon zur Verfügung gestellt.

Diese Frage ist konzeptueller, da ich bei der Implementierung jeder Lösung zuversichtlich wäre.

Frage

Die Frage ist: "Wo Sie die Informationen auf Ihrer ACL speichern tun?"

Mögliche Lösung

Ich habe derzeit ein statisches Array, dass ich mit den verschiedenen Aktionen und der Zugriffsebene von ihnen füllen.

Ich denke, dass dies leicht einschränkend ist und möglicherweise durch einen Datenbankspeicher besser bedient werden könnte.

Ich könnte eine Bitmaske verwenden, um die Benutzerrollen anzugeben, die Zugriff auf die verschiedenen Ressourcen haben, oder vielleicht eine Mindeststufe.

Das andere Problem, das ich habe, ist, dass es hierarchisch ist (bis zu einem gewissen Grad), aber mehrere Rollen könnten existieren - mit etwas anderen Berechtigungen.

eg. 
Admin has all roles of captain, secretary and user. 
Captain has all the roles of a user and the ability to pick players. 
Secretary has all the roles of a user and contact the opponent's secretary. 
Captain and secretary both have the ability to email players. 

Stellen Sie sich vor, wie etwas von einem Venn-Diagramm von Berechtigungen, wenn man so will.

Caching

Die nächste Ausgabe, wäre, dass der Zugriff auf die Datenbank jedes Mal, eine Performance-Overhead hinzufügen würde, so dass ich denke, das Caching würde es Sinn machen.

Das Problem würde dann kommen, wie man den Cache ungültig macht (es gibt nur zwei harte Sachen in der Informatik ...) ... vielleicht könnte es ein Datenbankfeld geben, das einen MD5-Hash der ACL hatte Beim Laden der Seite wird überprüft, ob die ACL-Informationen erneut geladen werden müssen.

+0

Ich würde dich stoßen, wenn ich könnte. Ich bin im Wesentlichen im selben Boot. Das Speichern der ACL in einer Datei (wie in der Dokumentation) ist ein wenig skizzenhaft. Können Sie diese Frage bearbeiten, wenn Sie bessere Möglichkeiten gefunden haben, dies zu tun? – TheMonarch

+1

Ich habe derzeit keine passende Lösung dafür gefunden. Es ist eine Schande, dass dieser Beitrag nicht mehr kommentiert wurde, da ich denke, dass es eine ziemlich interessante Frage ist. Ich denke, die Antwort ist, es in einer Datenbank zu speichern und dann zwischenzuspeichern? Es wäre gut, eine Klärung über die Vorteile zu haben, und wenn nicht, was wäre die Alternative? –

+0

Ja Monarch Sie Frage ist wirklich großartig und sehr häufig von der Phalcon Benutzer gefragt. Sogar ich suchte nach der gleichen Art von Lösung, die ich noch nirgends finde. Ich habe versucht, einen benutzerdefinierten Code zu schreiben, um die ACL dynamisch mit der DB zu machen, aber immer noch damit zu kämpfen. Bitte führen Sie, wenn Sie das gleiche erreicht haben. @Der Monarch –

Antwort

1

Ja @TheMmonarch Sie Frage ist wirklich großartig und sehr häufig von der phalcon Benutzer gefragt. Selbst ich suchte nach der gleichen Lösung, die ich noch nirgendwo finde. Ich habe versucht, einen benutzerdefinierten Code zu schreiben, um die ACL mithilfe der DB dynamisch zu machen, aber ich kämpfe immer noch damit.

Ich war surfen viele Websites und Blog dann schließlich ich mit solchen DB Struktur, die hilfreich sein könnte, um solche Art von System zu bauen kommen.

CREATE TABLE `roles` (
    `name` VARCHAR(32) NOT NULL, 
    `description` TEXT, 
    PRIMARY KEY(`name`) 
); 
CREATE TABLE `access_list` (
    `roles_name` VARCHAR(32) NOT NULL, 
    `resources_name` VARCHAR(32) NOT NULL, 
    `access_name` VARCHAR(32) NOT NULL, 
    `allowed` INT(3) NOT NULL, 
    PRIMARY KEY(`roles_name`, `resources_name`, `access_name`) 
); 

CREATE TABLE `resources` (
    `name` VARCHAR(32) NOT NULL, 
    `description` TEXT, 
    PRIMARY KEY(`name`) 
); 

CREATE TABLE `resources_accesses` (
    `resources_name` VARCHAR(32) NOT NULL, 
    `access_name` VARCHAR(32) NOT NULL, 
    PRIMARY KEY(`resources_name`, `access_name`) 
); 

CREATE TABLE `roles_inherits` (
    `roles_name` VARCHAR(32) NOT NULL, 
    `roles_inherit` VARCHAR(32) NOT NULL, 
    PRIMARY KEY(roles_name, roles_inherit) 
); 

vorschläge oder Änderung schätzen würde !!!