Empfehlungen: Erweiterte Suche

isAuthorized in default.ctp

Klassen zur Datenverarbeitung in den Controllern (DRY)

isAuthorized in default.ctp

Beitragvon Stef » Mo 31. Mai 2010, 16:56

Hallo zusammen,

ich hab mich jetzt in den letzten beiden Tagen etwas in cakephp eingearbeitet und bin eigentlich recht begeistert davon. Allerdings hab ich immer noch des öfteren etwas damit zu kämpfen.

Mein aktuelles Problem:
Meine Applikation besteht im Moment aus den beiden Controllern Users und Advertisements. Ich habe die Auth-Komponente im AppController eingebaut, und soweit funktioniert das alles. Allerdings möchte ich nun in der default.ctp für eingeloggte User ein anderes Menü anzeigen.
Zunächst dachte ich "Super, da muss ich ja einfach Auth->isAuthorized() aufrufen." Ich habe dann recht schnell festgestellt, das das in der default.ctp nicht geht.
Also dachte ich mir, ich setze im AppController einfach eine Variable die ich dann abfrage:
Code: Alles auswählen
class AppController extends Controller {
    var $components = array('Auth');

    function beforeFilter() {
        $this->set('authorized', $this->Auth->isAuthorized());
    }
}


Beim Aufruf von /advertisements/index durfte ich dann allerdings feststellen, dass isAuthorized() nur beim UsersController true zurückgibt.

Mein nächster Gedanke war "dann pack ich einfach wie gewohnt nach dem Login ein authorized-Flag in die Session". Gesagt, getan:
Code: Alles auswählen
class UsersController extends AppController {
    var $name = 'Users';
    function beforeFilter() {
        $this->Auth->autoRedirect = false;
    }

    function login() {
        if ($this->Auth->user()) {
            if (!empty($this->data)) {
                $this->Session->write('authorized', true);
            }
        }
        $this->redirect($this->Auth->redirect());
    }

    function logout() {
        $this->Session->destroy();
    }
}


Aber entgegen meiner Erwartungen war dieses Flag beim Aufruf des AdvertisementsControllers nicht in der Session zu finden. Hält Cake etwa für jeden Controller eine separate Session? Oder hab ich etwas falsch gemacht, bzw. steh ich einfach nur auf dem Schlauch?

Schon mal vielen Dank für eure Hilfe,
Viele Grüße Stefan

p.s.: Wirklich super Forum, vor allem mit vielen aktiven Mitgliedern :)
Stef
 
Beiträge: 4
Registriert: Mo 31. Mai 2010, 16:37

Re: isAuthorized in default.ctp

Beitragvon mbrod » Mo 31. Mai 2010, 17:46

Hält Cake etwa für jeden Controller eine separate Session?

Nein, aber die Auth Komponente wird nur in dem Controller geladen, wo sie auch deklariert ist. Wenn also für alle Controller die Komponente geladen werden soll, dies im "übergeordneten" app_controller.php einbinden.
Beispiel aus meinem Code:
Code: Alles auswählen
<?php
class AppController extends Controller {
    var $components=array('Auth');
   
    function beforeFilter(){
        $this->Auth->authorize='controller';
        $this->Auth->loginRedirect=array('controller'=>'pages','action'=>'home');
        $this->Auth->logoutRedirect=array('controller'=>'users','action'=>'login');
        $this->Auth->authError=__('Access denied! Possible reasons:',true).'<br />1.) '.
            __('no login',true).'<br />2.) '.
            __('session timeout',true).'<br />3.) '.
            __('despite login no authorization',true);
    }
}
?>

Die Einstiegsseite ist bei mir pages/home. Je nach "Berechtigung" (['User']['group'], ['User']['partnership_id']) bekommt der Benutzer etwas anderes nach dem Login zu sehen. Ohne Login bekommt der Besuchern nur den Verweis zur Login Seite angezeigt (else Zweig ganz unten):
Code: Alles auswählen
<?php
if(isset($auth['User']['group'])){
    if($auth['User']['group']=='admin' &amp;&amp; $auth['User']['partnership_id']>0){
        echo $html->link('Liste der Mitglieder',array('controller'=>'members_partnerships','action'=>'index'));
    }
    elseif($auth['User']['group']=='admin'){
        echo $this->element('adminhome');
    }
    else{
        echo'Benutzer ist angemeldet. Gruppe ungleich admin.';
    }
}
else{
    echo $html->link('Anmeldung',array('controller'=>'users','action'=>'login'));
}
?>

Vielleicht hilft mein Code ein bisschen in die CakePHP "Denke" reinzukommen.

Nachtrag: Das Forum "verhunzt" manchmal den Code:
$auth['User']['group']=='admin' && $auth['User']['partnership_id']>0
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: isAuthorized in default.ctp

Beitragvon Stef » Mo 31. Mai 2010, 18:59

Hi mbrod,

erst mal danke für die schnelle Antwort.

Nein, aber die Auth Komponente wird nur in dem Controller geladen, wo sie auch deklariert ist. Wenn also für alle Controller die Komponente geladen werden soll, dies im "übergeordneten" app_controller.php einbinden.

Das hab ich soweit eigentlich gemacht, und auf die Auth-Komponente kann ich auch aus allen Controllern zugreifen... Allerdings eben nur im UsersController mit dem erwünschten Ergebnis.
Ich hab übrigens wegen der Session zum Test eine kleine App erstellt, in der wirklich nur in der einen Action eine Variable geschrieben wird, die in der anderen wieder ausgelesen werden soll:
Code: Alles auswählen
// user.php
class User extends AppModel
{
    var $name = 'User';
}
// advertisement.php
class Advertisement extends AppModel
{
    var $name = 'Advertisement';
    var $belongsTo = 'User';
}
// app_controller.php
class AppController extends Controller {
    var $components=array('Session');
}
// users_controller.php
class UsersController extends AppController {
    var $name = 'Users';

    function index() {
        $this->Session->write('test', 'test');
    }
}
// advertisements_controller.php
class AdvertisementsController extends AppController {
    var $name = 'Advertisements';

    function index() {
    }
}
// in den beiden index.ctp Dateien lass ich lediglich die Session dumpen:
debug($this->Session->read());

Beim Aufruf von /users/index ist die Variable "test" vorhanden, wenn ich anschließend /advertisements/index aufrufe ist die Variable nicht vorhanden.

Noch eine Frage zu deinem Code: hast du das Array $auth selbst irgendwo angelegt oder sollte das von der Auth-Komponente angelegt werden?

Grüße und Danke
Stefan
Stef
 
Beiträge: 4
Registriert: Mo 31. Mai 2010, 16:37

Re: isAuthorized in default.ctp

Beitragvon mbrod » Mo 31. Mai 2010, 21:55

Noch eine Frage zu deinem Code: hast du das Array $auth selbst irgendwo angelegt oder sollte das von der Auth-Komponente angelegt werden?

Das wird von der Auth-Komponente selbst angelegt.

Das von Dir beschriebene Verhalten der Session Variable kann ich bei mir nicht nachvollziehen: Habe mal in mehreren von unterschiedlichen Controllern erzeugten views
Code: Alles auswählen
debug($this->Session->read());
eingefügt. Die über Session->write angelegten Variablen waren bei allen vorhanden.
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: isAuthorized in default.ctp

Beitragvon Stef » Mo 31. Mai 2010, 23:03

Das wird von der Auth-Komponente selbst angelegt.

Dann scheint da bei mir was grundsätzlich nicht so ganz zu passen, das Array ist bei mir nicht vorhanden.

Mit der Session hab ich wohl auch grundsätzlich das Problem, hab extra mal ein komplett jungfräuliches Cake app aufgesetzt um sicher zu gehen, dass ich nicht irgendwas vermurkst hab.
Welche Cake-Version benutzt du? Ich hab die 1.3er-Version... vielleicht gibts da irgendwelche Unterschiede, hab eine 1.2-1.3 Migration-Guide gefunden, werd morgen mal schaun ob sich da irgendetwas in der Hinsicht geändert hat.

Trotzdem schonmal vielen Dank für deine Hilfe.

Grüße Stefan
Stef
 
Beiträge: 4
Registriert: Mo 31. Mai 2010, 16:37

Re: isAuthorized in default.ctp

Beitragvon mbrod » Di 1. Jun 2010, 10:11

Das Projekt, an dem ich gerade werkele habe ich mit 1.2.5 angefangen und auf 1.3 migriert. (Knackpunkte fand ich, dass die Session-Komponente nicht mehr automatisch geladen wurde sowie einen Bug bei den gebackenen Standard i18n Meldungen, sodass teilweise nicht übersetzt wird.) Also alles was ich vorher erwähnt habe bezieht sich auf 1.3.0.
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: isAuthorized in default.ctp

Beitragvon Stef » Di 1. Jun 2010, 12:17

So, da die Session nicht einmal bei einem frisch aufgesetzten App funktioniert hat und da ich im ganzen weiten Web niemanden mit einem ähnlichen Problem gefunden habe, dachte ich mir ich lade Cake nochmal runter... nicht, dass da doch schon irgendwas kaputt ist.

Und tatsächlich, es funktioniert alles wie es soll. Obwohl ich es mir eigentlich nicht vorstellen kann hab ich da wohl doch irgendwo meine Finger drin gehabt ;D

Aber ich danke dir trotzdem vielmals für deine Unterstützung :)

Grüße Stefan
Stef
 
Beiträge: 4
Registriert: Mo 31. Mai 2010, 16:37


Zurück zu Components

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast