Empfehlungen: Erweiterte Suche

Direktes Routing zum Login

Fragen und Diskussionen zur Installation und Konfiguration von Cake.

Direktes Routing zum Login

Beitragvon Luckie » Di 3. Nov 2009, 15:10

Mittels Routen versuche ich ein direktes Routing zum Login hinzubekommen. Dazu habe ich die bestehende routes.php wie folgt ergänzt:
Code: Alles auswählen
<?php
    //admin
    Router::connect('/', array('controller' => 'users', 'action' => 'login', 'admin' => true)); // [mp] Direktes Routing zum Login
    Router::connect('/admin/', array('controller' => 'pages', 'action' => 'display', 'home', 'admin' => 1));
    Router::connect('/admin/:controller/:action/*', array('admin' => 1));
    //pages
    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
    //users/edit
    //Router::connect('/admin/benutzeraccounts/edit/*', array('controller' => 'benutzeraccounts', 'action' => 'edit'))
?>

Funktioniert auch, nur leider ruft er nach dem Login wieder die Login Seite auf. Man kommt aus dem Login also nicht mehr raus. Da stimmt also noch irgendwas nicht so ganz.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Direktes Routing zum Login

Beitragvon Mathias » Di 3. Nov 2009, 15:56

Wenn du Auth benutzt, brauchst du nicht zwangsläufig eine Route zu deiner login-Seite setzen.
Ich hab das so gelöst:

Im beforeFilter() des app_controllers
Code: Alles auswählen
$this->Auth->loginAction    = array(Configure::read('Routing.admin') => true, 'controller' => 'users', 'action' => 'login'); # Redirect zur login-Funktion, wenn der User nicht eingeloggt ist.
$this->Auth->autoRedirect   = false; # Wichtig, wenn du selbstdefinierte redirects nach dem login veranlassen möchtest. Man kann auch einen Standardredirect festlegen. Hierzu nochmal in die api schauen.
$this->Auth->logoutRedirect = array(Configure::read('Routing.admin') => true, 'controller' => 'users', 'action' => 'login'); # Redirect nach der Logout-Funktion.
$this->Auth->authError      = __('You are not authorized to access that location.', true); # Flashmessage, wenn der User nicht eingeloggt ist und versucht auf eine gesicherte Seite zuzugreifen.
$this->Auth->loginError     = __('You are not logged in. Please make sure that the username and the password are correct.', true); # Wenn der Login nicht klappt.


Auszug aus der login action des users_controllers
Code: Alles auswählen
if ($this->Session->read('Auth.redirect') == '/' || !$this->Session->check('Auth.redirect')) { # Wenn redirect base ist oder noch kein redirect gesetzt wurde >> Nochmal weiter unten im Text den Link anschauen!
    $this->redirect(array(Configure::read('Routing.admin') => true, 'controller' => 'users', 'action' => 'view', $this->Session->read('Auth.User.id'))); # Irgendeine Standardseite, die du anzeigen möchtest, wenn der User vorher nicht versucht hat, auf eine andere Seite zuzugreifen.
} else {
    $this->redirect($this->Auth->redirect()); # Redirect zu der Seite, die der User aufrufen wollte.
}


Ich will aber nochmal auf das Problem mit Route und Auth aufmerksam machen. >> controller/route-und-auth-behaken-sich-t65.html
cheers
Benutzeravatar
Mathias
 
Beiträge: 225
Registriert: Mi 4. Jun 2008, 22:30
Wohnort: Berlin
CakePHP-Version: 1.3.x
OS: OS X 10.6.x

Re: Direktes Routing zum Login

Beitragvon Luckie » Mi 4. Nov 2009, 09:57

Die before_Filter() Methode in meinem app_controller sieht jetzt so aus:
Code: Alles auswählen
    function beforeFilter() {
        // [mp:start]
        $this->Auth->loginAction = array(Configure::read('Routing.admin') => true, 'controller' => 'users', 'action' => 'login');
        $this->Auth->autoRedirect = false;
        // [mp:end]
       
        header('Content-type: text/html; charset="utf-8"');
        uses('L10n');          
       
        setlocale(LC_ALL, 'de_DE.utf8');           
        Configure::write('Config.language', "de");         
       
        // [mp:start]      
        $this->Auth->authorize = 'controller';         
        // [mp:end]
       
        //backend is protected     
        if(!empty($this->params['admin']) &amp;&amp; $this->params['admin'] == 1){                 
            $this->layout = "admin";
            if (isset($this->Auth)) {              
                $this->Auth->userModel = 'User';
                $this->Auth->fields = array('username' => 'email', 'password' => 'password');
                $this->Auth->loginAction = '/admin/users/login';
                $this->Auth->loginRedirect = '/admin/users/';
                $this->Auth->autoRedirect = true;
                $this->user = $this->Auth->user();
                if(empty($this->user) &amp;&amp; $this->RequestHandler->isAjax()){
                    $this->render(null, 'ajax', APP . 'views/elements/ajax_login_message.ctp');
                }
                $this->set('user', $this->user);
                $this->_setAdminMenu();
            }
            if($this->name == 'Users' &amp;&amp; $this->action == 'admin_login'){
                $this->layout = 'admin_login';
            }
        }else{
            $this->Auth->allow();
        }          
    }

Von mir sind nur die markierten Stellen. Leider wird die Loginseite nicht aufgerufen, wenn ich nur http://www.domain.de aufrufe. Stattdessen sehe ich diese CakePHP Standardseite mit den grünen Boxen ("Sweet, "App" got Baked by CakePHP!"). Die Route habe ich erstmal wieder auskommentiert.

Edit: Wenn ich den Teil mit //backend is protected auskommentiere, komme ich zur Loginseite, allerdings kann ich mich dann nicht anmelden, weil er meint Benutzername und/oder Passwort wären falsch. OK, die Authentifizierung findet irgendwo in diesem Codeblock statt. Allerdings verstehe ich noch nicht so ganz wie das funktioniert.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Direktes Routing zum Login

Beitragvon Luckie » Di 10. Nov 2009, 11:03

Wir haben das jetzt mal etwas umgeschrieben:
Code: Alles auswählen
        $this->Auth->userModel = 'User';
        $this->Auth->fields = array('username' => 'email', 'password' => 'password');
        $this->Auth->autoRedirect = true;
        $this->Auth->loginAction = 'admin/users/login';    
        $this->Auth->loginRedirect = '/admin/users/';  
        //backend is protected 
        if(!empty($this->params['admin']) &amp;&amp; $this->params['admin'] == 1)
        {          
            if (isset($this->Auth))
            {                                                              
                $this->user = $this->Auth->user();             
                if(empty($this->user) &amp;&amp; $this->RequestHandler->isAjax()){
                    $this->render(null, 'ajax', APP . 'views/elements/ajax_login_message.ctp');
                }
                $this->set('user', $this->user);
                $this->_setAdminMenu();
                               
                if($this->name == 'Users' &amp;&amp; $this->action == 'admin_login')
                {
                    $this->layout = 'admin_login';
                }
                $this->Auth->allow();                          
            }  
            else
            {                                  
                $this->Auth->allow();
            }
        }

Damit geht er auch direkt zum Login. Allerdings will er nach dem Login nach /pages/index, obwohl ich ihm doch gesagt habe $this->Auth->loginRedirect = '/admin/users/'; er soll nach /admin/users gehen. Die Action /pages/index gibt es übrigens gar nicht.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Direktes Routing zum Login

Beitragvon Luckie » Di 10. Nov 2009, 13:55

Es muss heißen:
Code: Alles auswählen
}else{         
            $this->Auth->allow();
            $this->redirect('/admin/users/login');
        }

dann funktioniert es wie gewünscht.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Direktes Routing zum Login

Beitragvon euromark » Di 10. Nov 2009, 15:50

Vor allem ist
Code: Alles auswählen

            if (isset($this->Auth))
            {                                                              
                 ...                    
            }  
            else
            {                                  
                $this->Auth->allow();
            }
 

irgendwie sinnlos^^

wenn das object nich vorhanden ist, kann man darauf auch keine allow() methoden ausführen
euromark
 
Beiträge: 642
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Re: Direktes Routing zum Login

Beitragvon Luckie » Di 10. Nov 2009, 16:13

Keine Ahnung, der Code stammt nicht von mir. Aber genau die Stelle hat mich so verwirrt.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Direktes Routing zum Login

Beitragvon euromark » Di 10. Nov 2009, 18:12

das is ja keine ausrede^^
das is basic OOP bzw basic php - dass dies nicht nur sinnlos, sondern sogar fehlerhaft ist

ist mir grad besonders ins auge gefallen
aber der rest sieht nich allzu schlimm aus

$this->params['admin'] ist bei dir mal true, mal 1
lieber auf !empty() allein prüfen, dann liegt man auf der sicheren seite

und die redirect actions sollten alle in array-style geschrieben sein - wenn sich am routing was ändert, ändert es sich sonst nich mit
euromark
 
Beiträge: 642
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Re: Direktes Routing zum Login

Beitragvon Luckie » Di 10. Nov 2009, 21:34

Ist ja auch mittlerweile korrigiert. ;)
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Direktes Routing zum Login

Beitragvon euromark » Di 10. Nov 2009, 21:53

was? ich seh nix? :)
im beitrag vom "Mi 4. Nov 2009, 10:57"

meinst du den ersten post?
ja da schauts besser aus
euromark
 
Beiträge: 642
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Nächste

Zurück zu Installation und Konfiguration

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron