Empfehlungen: Erweiterte Suche

Probleme mit Installer-Skript und ACL

Daten auslesen, verarbeiten und den Views übergeben

Probleme mit Installer-Skript und ACL

Beitragvon Esteba » Do 14. Okt 2010, 08:47

Hallo allerseits,

Ich bin Anfänger mit CakePHP und habe angefangen, eine erste Anwendung damit umzusetzen, die leicht auf anderen Servern neu aufsetzbar sein soll. Deshalb habe ich einen Installer geschrieben, der folgendes macht:

- Benötigte DB-Tabellen erstellen
- ACO-Datensätze für die Benutzerrechteverwaltung mit ACL anlegen
- ACL initialisieren (Datensätze für die Berechtigungen jedes normalen Users anlegen)
- Einen Administrator anlegen (Benutzerdaten werden im Installer übergeben)

So sieht das dann aus:

Code: Alles auswählen
function process() { // führt die Installation durch
        if(!$this->db->isConnected()) {
            exit('Verbindung zur Datenbank konnte nicht hergestellt werden. Bitte prüfen Sie die Konfiguration in app/config/database.php.');
        } else {
            echo 'Verbindung zur Datenbank wurde hergestellt'."<br />\n";
           
            if (empty($this->data)) {
                echo 'Es wurden keine Daten &amp;uuml;bermittelt'."<br />\n";
            } else {

                try
                {
                    // Vorhandene Tabellen löschen
                    if (count($this->db_structure) > 0) {
                        if ($this->dropTables(array_keys($this->db_structure))) {
                            echo 'Datenbank wurde geleert.'."<br />\n";
                        }
                    }

                    // Benötigte Tabellen hinzufügen
                    foreach ($this->db_standard as $name => $columns) {
                        if ($this->generateTable($name,$columns)) {
                            echo 'Tabelle '.$name.' wurde angelegt.'."<br />\n";
                        }
                    }

                    // ACL-Tabellen füllen
                    $this->build_acl();

                    // Datenbank für ACL initialisieren
                    $this->initDB();

                    // Ersten User anlegen
                    $this->data['User']['group_id'] = 2;
                    $this->data['User']['activation'] = null;
                    $this->User->create();
                    $this->User->data = Sanitize::clean($this->data);
                    if ($this->User->save($this->User->data)) {
                            echo 'Der Administrator wurde registriert.'."<br />\n";
                    } else {
                            throw new install_exception('Der User konnte nicht angelegt werden.');
                    }

                    $this->redirect('/install/finish');
                }
                catch (install_exception $exception)
                {
                    die('Installation fehlgeschlagen:'."<br/>\n<div>".$exception->getMessage()."</div><br />\n");
                }

            }
             
        }
    }


Die Funktionen "build_acl" und "initDB" entstammen diesem Tutorial und haben beim Aufrufen "von Hand" (im Browser, mit bereits vorhandener DB-Struktur und eingeloggt) ohne Probleme funktioniert.

Leider komme ich trotzdem vor allem mit der ACL in Konflikt. Wenn die Anwendung auf einem neuen Server mit leerer Datenbank installiert wird, sorgen diese zwei Zeilen im App_Controller schon mal für Probleme:
Code: Alles auswählen
var $components = array('Auth', 'Acl', 'RequestHandler');
var $uses = array('Project','User');

Ich brauche die ACL-Komponenten sowie das User-Model in so gut wie jedem Controller und auch im App_Controller selbst, deswegen würde ich das gerne da drin lassen, allerdings bekomme ich Fehlermeldungen, wenn die entsprechenden Tabellen zu den Komponenten und Models nicht vorhanden sind. Wie löse ich das am besten - Unterbinden der Fehlermeldungen, oder wirklich zusehen, dass die Komponenten und Models nur da eingebunden werden, wo die Datenbank-Tabellen auch wirklich schon vorhanden sind?

Zweites Problem: Auch, wenn ich die Tabellen schon erzeuge und dann den Installer mit importierten Komponenten und Models laufen lasse, treten mehrere Fehler auf:

Einmal von der ACL:
Warning (512): DbAcl::allow() - Invalid node [CORE/cake/libs/controller/components/acl.php, line 325]

Irgendetwas muss da falsch übergeben worden sein, aber ich verstehe nicht was, denn die ACL braucht doch eigentlich nicht mehr als die Datenbank-Tabellen und die gibt es ja! Ich habe es auch schon damit versucht, die ACL-Settings, die ich sonst im App_Controller vornehme, in den Installer zu packen, hilft auch nicht.

Zweiter Fehler:
Fatal error: Call to undefined method stdClass::create() in /var/www/vhosts/makersweb.de/subdomains/dev/httpdocs/projektseite/app/controllers/install_controller.php on line 878

Das passiert beim Anlegen des Users. Wieso kann ich nicht mit "create" einen neuen User erzeugen, obwohl das User-Model doch importiert wird? Oder hat es mit etwas völlig anderem zu tun? Wie gesagt, ich bin noch Anfänger und lebe von guten Tutorials und Google. =)

Ich hab auch schon das Internet nach Lösungen durchforstet, allerdings sind die Probleme wohl einfach zu speziell, um da schnell fündig zu werden. Wäre sehr dankbar, wenn mir jemand helfen könnte!
Esteba
 
Beiträge: 6
Registriert: Do 14. Okt 2010, 08:20

Re: Probleme mit Installer-Skript und ACL

Beitragvon Esteba » Fr 29. Okt 2010, 21:09

Wurde ja richtig heiß diskutiert, mein Problem. ;)

Habs inzwischen selbst herausgefunden: Die Fehler lagen doch an einer falschen Angabe von "$uses", allerdings nicht im App_Controller, sondern im Install-Controller. Da muss man schon aufpassen, dass man seine eigenen Einstellungen nicht überschreibt.

Bin von dem gelösten Problem gleich ins nächste geschlittert: Wieder ist es die ACL. Und zwar möchte ich die Standard-Benutzergruppen (bestimmen die Benutzerrechte!) und den ersten User, also den Administrator, in die Datenbank einfügen, was ich mit dem gleichen Code löse, wie auf den jeweiligen "Add"-Seiten der beiden Models.

Code: Alles auswählen
// Gruppen anlegen
foreach ($this->groups as $group) {
    $this->Group->create();
    $this->Group->data['name'] = $group;
    if ($this->Group->save($this->Group->data)) {
        echo 'Die Gruppe "'.$group.'" wurde angelegt.'."<br />\n";
    } else {
        die('Die Gruppe "'.$group.'" konnte nicht angelegt werden.');
    }
}

// Ersten User anlegen
$this->data['User']['group_id'] = 2;
$this->data['User']['activation'] = null;

$this->User->create();
$this->User->data = Sanitize::clean($this->data);
if ($this->User->save($this->User->data)) {
    echo 'Der Administrator wurde registriert.'."<br />\n";
} else {
    throw new install_exception('Der User konnte nicht angelegt werden.');
}


Das Ergebnis:
Warning (512): AclNode::node() - Couldn't find Aro node identified by "Array
(
[Aro0.model] => Group
[Aro0.foreign_key] => 1
)
" [CORE/cake/libs/model/db_acl.php, line 191]

Warning (512): DbAcl::allow() - Invalid node [CORE/cake/libs/controller/components/acl.php, line 325]

Warning (512): AclNode::node() - Couldn't find Aro node identified by "Array
(
[Aro0.model] => Group
[Aro0.foreign_key] => 2
)
" [CORE/cake/libs/model/db_acl.php, line 191]


Ich kann das Problem umgehen, indem ich die Spalten "von Hand", also mit SQL-Befehlen in die Datenbank einfüge. Das finde ich rein softwarearchitektonisch betrachtet aber sehn unschön, deshalb hätte ich das Problem gerne noch gelöst.
Meine Vermutung ist, dass die ACL in dem Moment, in dem ich die Gruppen anlege, für die Überprüfung der Berechtigung bereits nach vorhandenen Gruppen sucht und dann deren Fehlen bemängelt. Wenn ich die Prüfung der Zugriffsrechte eben temporär deaktivieren könnte, würde es wohl kein Problem geben. Aber wie, weiß ich eben nicht.
Esteba
 
Beiträge: 6
Registriert: Do 14. Okt 2010, 08:20


Zurück zu Controller

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron