Bonjour, J'aurais dû penser à poster ici plus tôt, parce que du côté de [url=http://forum.cakephp-fr.org]forum.cakephp-fr.org[/url], c'est toujours les vacances à 100%, il n'y a personne pour aider et je me retrouve limite niveau délais ... Je dois mettre en place un système d'identification à double entrée pour un projet qui approche de la fin (...). J'ai suivis ce [url=http://www.formation-cakephp.com/358/authentification-double-entree-cakephp-1-3]tuto[/url]. Je dispose (entre autres) de deux tables 'users' et 'membres'. La tables 'users' correspond au modèle 'User' et au controller 'Users'. Ceci correspond à la partie administration qui fonctionne à merveille. La tables 'membres' correspond au modèle 'Membre' et au controller 'Membres'. Ceci correspond à la partie utilisateurs et malheureusement, il y a un problème. Quand je souhaite accéder à http://monsite/membres, cake envois un message : [code]Missing Controller Error: LoginController could not be found. Error: Create the class LoginController below in file: app\controllers\login_controller.php<?php class LoginController extends AppController {

var $name = 'Login';

}
?>[/code] Alors que je suis bien redirigé vers monsite/membres/login et que je vois mon beau message d'info "Vous n'avez pas accès à cette page" ... Pour info: **App Controlleur** [code]<?php class AppController extends Controller
{
var $components = array('AppAuth', 'Session');
}[/code]

AppAuthComponent
[code]<?php
App::import('Component', 'Auth');

class AppAuthComponent extends AuthComponent
{
/**

  • Configuration par défaut
  • @var array
    /
    var $defaults = array(
    'userModel' => 'User', 'userScope' => array(null), 'fields' => null, 'loginAction' => null, 'loginRedirect' => null, 'logoutRedirect' => null, 'autoRedirect' => true, 'loginError' => "Identifiant ou mot de passe incorrects.", 'authError' => "Vous n'avez pas accès à cette page.", 'flashElement' => 'default', ); /** * Configurations possibles en fonction du préfixe de la route * * @var array */ var $configs = array( 'admin' => array( 'userModel' => 'User', 'fields' => array('username' => 'login', 'password' => 'password'), 'loginAction' => array('controller' => 'users', 'action' => 'login', 'admin' => false), 'loginRedirect' => array('controller' => 'users', 'action' => 'home', 'admin' => true), 'logoutRedirect' => array('controller' => 'users', 'action' => 'login', 'admin' => false), 'flashElement' => 'flash_att' ), 'membres' => array( 'userModel' => 'Membre', 'fields' => array('username' => 'email', 'password' => 'password'), 'loginAction' => array('controller' => 'membres', 'action' => 'login', 'membres' => false), 'loginRedirect' => array('controller' => 'membres', 'action' => 'home', 'membres' => true), 'logoutRedirect' => array('controller' => 'membres', 'action' => 'login', 'membres' => false), 'flashElement' => 'flash_att' ), ); /** * Démarrage du composant. * Autorisation si pas de préfixe dans la Route qui a conduit ici. * * @param object $controller Le contrôleur qui a appelé le composant. */ function startup(&$controller) { $prefix = null; if(empty($controller->params['prefix'])) { $this->allow(); } else { $prefix = $controller->params['prefix']; } // Cas spécial des actions de login et logout, pour lesquelles le préfixe n'existe pas if(in_array($controller->action, array('login', 'logout'))) { switch($controller->name) { case 'Users': $prefix = 'admin'; break; case 'Membres': $prefix = 'membres'; break; } } $this->_setup($prefix); parent::startup($controller); } /** * Définition des variables de config en fonction d'un préfixe * * @param string $prefix */ function _setup($prefix) { $settings = $this->defaults; if(array_key_exists($prefix, $this->configs)) { $settings = array_merge($settings, $this->configs[$prefix]); } $this->_set($settings); } }[/code] **Préfixes core.php** [code]Configure::write('Routing.prefixes', array('admin', 'membres'));[/code] **Routes** [code] Router::connect('/admin', array('controller' => 'users', 'action' => 'index', 'prefix' => 'admin')); Router::connect('/membres', array('controller' => 'membres', 'action' => 'index', 'prefix' => 'membres')); [/code] **membres controller*\
    [code]<?php class MembresController extends AppController
    {
    var $name = "Membres";

    function membres_index()
    {

    }

    function add()
    {
    $data = array();
    $data['Membre']['email'] = 'guigui.wuip@gmail.com';
    $data['Membre']['password'] = 'membre';
    $this->Membre->save($data); } function login() { } function logout() { $this->redirect(array('controller' => 'pages', 'action' => 'display', 'home')); } } [/code] **Users controlleur** [code]<?php class UsersController extends AppController
    {
    function admin_index()
    {

    }

    function add()
    {
    $data = array();
    $data['User']['login'] = 'admin';
    $data['User']['password'] = 'admin';
    $this->User->save($data); } function login() { } function logout() { $this->redirect(array('controller' => 'pages', 'action' => 'display', 'home')); } } [/code] Merci d'avance pour votre aide, Guiguiwuip

19 réponses


Guiguiwuip
Auteur
Réponse acceptée

Résolu en enlevant le script pour cas spéciaux des actions de login et de logout donc, en ajoutant des routes, puis en desactivant l'autoRedirect du login membres.

Si j'overrésume
monsite/membres/login
Pointe vers un controller login alors qu'il ne devrait pas ?

Si c'est ça c'est normal => membres est un prefix donc il cherche la vue membres_index dans le controller login.

J'ai loupé un truc ?

C'est ça, sauf que normalement le prefix doit être désactivé en cas d'action login / logout :

// Cas spécial des actions de login et logout, pour lesquelles le préfixe n'existe pas
    if(in_array($controller->action, array('login', 'logout')))
    {
      switch($controller->name)
      {
        case 'Users':
          $prefix = 'admin';
          break;

        case 'Membres':
          $prefix = 'membres';
          break;
      }

Pas très propre, rajoute plutot membres/login dans les routes, ça évitera les problèmes.

J'ai rajouté ces routes donc :

Router::connect('/membres/login', array('controller' => 'membres', 'action' => 'login','membres' => false));
    Router::connect('/admin/login', array('controller' => 'users', 'action' => 'login','admin' => false));

Mais, sur monsite/membres/login ou admin/login, j'ai l'erreur :

Missing Method in MembresController
Error: The action membres_login is not defined in controller MembresController
Error: Create MembresController::membres_login() in file: app\controllers\membres_controller.php.
<?php
class MembresController extends AppController {
    var $name = 'Membres';

    function membres_login() {
    }
}
?>

J'ai fais pleins d'essais, ma partie admin marche à 100% maintenant, mais j'ai un nouveau problème au niveau des membres.

Tout d'abord un bon point: quand j'accès à monsite/membres/login, pas d'erreur apparement. Je rempli donc le formulaire et valide.
Mais je suis alors rediriger sur monsite/membres/membres_login avec l'erreur logique :

Missing Controller
Error: MembresLoginController could not be found.
Error: Create the class MembresLoginController below in file: app\controllers\membres_login_controller.php
<?php
class MembresLoginController extends AppController {
    var $name = 'MembresLogin';
}
?>

Là, je comprend pas ...

Tu es redirigé avant le traitement du form ou après ?

A l'envoi du form, après avoir cliqué sur l'input submit. (d'ailleurs j'aimerais bien te dire quelles requêtes SQL sont effectuées mais, malgré mon debug = 2, rien ne s'affiche dans mon cake... J'ai un paquet de surprise sur ce projet.)

si tu n'a pas $this->element('sql_dump'); tu n'aura pas d'erreur nul part.

En fait ma question c'est plutôt l'url sur l'action du form est elle bonne ou pas ?

Au départ, j'avais ça :

$this->Form->create('Membre');

Du coup, là je viens de le transformer en ça :

$this->Form->create('Membre', array('url' => array('controller' => 'membres', 'action' => 'login', 'membres' => true)));

C'est mieux, à l'envoi du form il me recharge la page comme si mon mdp était mauvais, je vais essayer de voir ça.

Mais pourquoi est-ce que ça marche pour la partie admin et non pour la partie membre ?

Regarde côté SQL dump si tu as des trucs pas normaux.

Il semble qu'il n'y ai pas de requête d'envoyée à la table à l'envoi du form.

Petit up :) Désolé de précipiter les choses, mais j'arrive à la fin de mon developpement, et tout ce qui me reste à faire est conditionné par ce problème que je n'arrive pas à résoudre. Merci encore :)

Hello Guiguiwuip,

Je souhaite faire la même chose que ce que tu expliques dans ce topic et j'aurai voulu savoir si tu avais trouvé une solution?

J'ai moi même suivi le tuto formation-cakephp.com mais sans succès avec cakephp2.

Merci

Salut molodoi !

Comme indiqué tout en haut, j'ai résolu le problème en faisant ceci : "Résolu en enlevant le script pour cas spéciaux des actions de login et de logout donc, en ajoutant des routes, puis en desactivant l'autoRedirect du login membres."

Tout ça date d'un moment maintenant, dis moi si tu t'en sors avec ça. Sinon, je replongerais dans mon code pour être précis.

Hello Guiguiwuip,

Merci à toi pour la réponse ;)

J'ai commenté "cas spéciaux des actions de login et de logout" par contre "en ajoutant des routes, puis en désactivant l'autoRedirect du login membres" que veux-tu dires par là qu'elles genres de routes et où se trouve autoredirect du login membres :D

Je te copie/colle les fichiers pour que tu vois un peu le dallage :

app/Config/core.php :

Configure::write('Routing.prefixes', array('mtadmin451','customers'));

app/Config/routes.php :

Router::connect(
        '/mtadmin451', array('controller' => 'users', 'action' => 'home', 'prefix' => 'mtadmin451','admin'=> true)
);
Router::connect(
        '/customers', array('controller' => 'customers', 'action' => 'home', 'prefix' => 'customers','customers'=> true)
);

app/Controller/AppController.php :

<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
    var $helpers = array('Html', 'Form', 'Text', 'Session');
    var $components = array('AppAuth','Session');
    function beforeRender() {
        if (!empty($this->request->params'prefix'])) {
            $this->layout = $this->request->params'prefix'];
        }
    }
}
?>

app/Controller/Component/AppAuthComponent.php :

<?php
App::import('Component', 'Auth');
class AppAuthComponent extends AuthComponent {
    /**
     * Configuration par défaut
     *
     * @var array
     */
    var $defaults = array(
        'userModel' => 'User',
        'userScope' => array(null),
        'fields' => null,
        'loginAction' => null,
        'loginRedirect' => null,
        'logoutRedirect' => null,
        'autoRedirect' => true,
        'loginError' => "Identifiant ou mot de passe incorrects.",
        'authError' => "Vous n'avez pas accès à cette page.",
        'flashElement' => 'default',
    );
    /**
     * Configurations possibles en fonction du préfixe de la route
     *
     * @var array
     */
    var $configs = array(
        'mtadmin451' => array(
            'userModel' => 'User',
            'userScope' => array('User.isValid' => 0),
            'fields' => array('username' => 'login', 'password' => 'password'),
            'loginAction' => array('controller' => 'users', 'action' => 'login', 'admin' => false),
            'loginRedirect' => array('controller' => 'users', 'action' => 'home', 'admin' => true),
            'logoutRedirect' => array('controller' => 'users', 'action' => 'login', 'admin' => false),
            'flashElement' => 'admin_notice',
        ),
        'customers' => array(
            'userModel' => 'Customer',
            'userScope' => array('Customer.isValid' => 0),
            'fields' => array('username' => 'email', 'password' => 'password'),
            'loginAction' => array('controller' => 'customers', 'action' => 'login', 'customers' => false),
            'loginRedirect' => array('controller' => 'customers', 'action' => 'home', 'customers' => true),
            'logoutRedirect' => array('controller' => 'customers', 'action' => 'login', 'customers' => false),
            'flashElement' => 'public_notice'
        ),
    );
    /**
     * Démarrage du composant.
     * Autorisation si pas de préfixe dans la Route qui a conduit ici.
     *
     * @param object $controller Le contrôleur qui a appelé le composant.
     */
    function startup(&$controller) {
        $prefix = null;

        if (empty($controller->params'prefix'])) {
            $this->allow();
        } else {
            $prefix = $controller->params'prefix'];
        }
        // Cas spécial des actions de login et logout, pour lesquelles le préfixe n'existe pas
        /*
          if(in_array($controller->action, array('login', 'logout')))
          {
          switch($controller->name)
          {
          case 'Users':
          $prefix = 'mtadmin451';
          break;
          case 'Customers':
          $prefix = 'customers';
          break;
          }
          }
         */
        $this->_setup($prefix);
        parent::startup($controller);
    }
    /**
     * Définition des variables de config en fonction d'un préfixe
     *
     * @param string $prefix
     */
    function _setup($prefix) {
        $settings = $this->defaults;
        if (array_key_exists($prefix, $this->configs)) {
            $settings = array_merge($settings, $this->configs$prefix]);
        }
        $this->_set($settings);
    }
}
?>

app/Controller/CustomersController.php :

<?php
App::uses('AppController', 'Controller');
/**
 * Customers Controller
 *
 * @property Customer $Customer
 */
class CustomersController extends AppController {
    var $name = "Customers";

    function customers_home(){
        $this->layout = 'customers';
    }

    function login(){
    }
    function logout(){
            $this->redirect($this->AppAuth->logout());
    }
    /* .... */
}
?>

app/Controller/UsersController.php :

<?php
App::uses('AppController', 'Controller');
/**
 * Users Controller
 *
 * @property User $User
 */
class UsersController extends AppController {
    var $name = "Users";

    public function mtadmin451_home() {
        $this->layout = 'mtadmin451';
    }
    function login(){

    }
    function logout(){
            $this->redirect($this->AppAuth->logout());
    }
    /* .... */
}
?>

et les vues de formulaires login.ctp dans dans leurs réperetoires respectifs app/Views/Users/ et app/Views/Customers

Mes problèmes :

Quand j'attaque l'url http://localhost/appcakecommande/mtadmin451 ça me redirige bien vers http://localhost/appcakecommande/users/login.

Quand j'attaque l'url http://localhost/appcakecommande/customers ça me redirige bien vers http://localhost/appcakecommande/customers/login avec l'erreur du LoginController suivante :
Missing Controller
Error: LoginController could not be found.
Error: Create the class LoginController below in file: app\Controller\LoginController.php
<?php class LoginController extends AppController {} ?>

en faisant un var_dump de $controller dans la fonction startup :

var_dump($controller);
if (empty($controller->params'prefix'])) {
$this->allow();
} else {
$prefix = $controller->params'prefix'];
}

je m'aperçois que le controller et l'action ne sont pas bon

...
public 'request' =>
object(CakeRequest)[9]
public 'params' =>
array (size=7)
'plugin' => null
'controller' => string 'login' (length=5)
'action' => string 'customers_index' (length=15)
'named' =>
array (size=0)
...
'pass' =>
array (size=0)
...
'prefix' => string 'customers' (length=9)
'customers' => boolean true
...

Bref, je suis toujours dans les choux ça m'rend dingue :D

Merci à toi ;)

Attention, les codes ci-dessous sont tirés d'un Cake 1.3

Pour les routes, j'ai ça en plus chez moi :

Router::connect('/admin', array('controller' => 'users', 'action' => 'index', 'admin'=> true));
    Router::connect('/membres', array('controller' => 'membres', 'action' => 'index','membres' => true));
    Router::connect('/membres/login', array('controller' => 'membres', 'action' => 'login', 'membres' => false));
    Router::connect('/membres/inscription', array('controller' => 'membres', 'action' => 'inscription', 'prefix' => false, 'membres' => false));
    Router::connect('/users/login', array('controller' => 'users', 'action' => 'login','admin' => true));

On dirait bien que j'aide Cake à trouver les bonnes routes pour mes deux types d'utilisateurs ("admin" qui correspond à users et "membres");

Voilà mon app_auth.php :

<?php
App::import('Component', 'Auth');
class AppAuthComponent extends AuthComponent
{
    /**
     * Configuration par défaut
     *
     * @var array
     */
    var $defaults = array(
        'userModel' => 'User',
        'userScope' => array(null),
        'fields' => null,
        'loginAction' => null,
        'loginRedirect' => null,
        'logoutRedirect' => null,
        'autoRedirect' => true,
        'loginError' => "Identifiant ou mot de passe incorrects.",
        'authError' => "Vous devez être inscrit pour pouvoir accéder à cette page.",
                'scopeError' => "Vous avez supprimé votre compte.",
        'flashElement' => 'flash_att',
    );

        /**
     * Configurations possibles en fonction du préfixe de la route
     *
     * @var array
     */
    var $configs = array(
        'admin' => array(
            'userModel' => 'User',
            'fields' => array('username' => 'login', 'password' => 'password'),
            'loginAction' => array('controller' => 'users', 'action' => 'login', 'admin' => false),
            'loginRedirect' => array('controller' => 'users', 'action' => 'index', 'admin' => true),
            'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home', 'admin' => false),
                        'authError' => "Seul les administrateurs ont accès à cette partie du site."         
        ),
        'membres' => array(
            'userModel' => 'Membre',
                        'userScope' => array('Membre.disabled' => 0),
            'fields' => array('username' => 'email', 'password' => 'password'),
            'loginAction' => array('controller' => 'membres', 'action' => 'login', 'membres' => false),
            'loginRedirect' => array('controller' => 'membres', 'action' => 'index', 'membres' => true),
            'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home', 'membres' => false)
        ),
    );

        /**
     * Démarrage du composant.
     * Autorisation si pas de préfixe dans la Route qui a conduit ici.
     *
     * @param object $controller Le contrôleur qui a appelé le composant.
     */
    function startup(&$controller)
    {
        $prefix = null;

        if(empty($controller->params'prefix']))
        {
            $this->allow();
        }
        else
        {
            $prefix = $controller->params'prefix'];
        }

        $this->_setup($prefix);

        parent::startup($controller);
    }

    /**
     * Définition des variables de config en fonction d'un préfixe
     *
     * @param string $prefix
     */
    function _setup($prefix)
    {
        $settings = $this->defaults;

        if(array_key_exists($prefix, $this->configs))
        {
            $settings = array_merge($settings, $this->configs$prefix]);
        }

        $this->_set($settings);
    }
}

Il se trouve que mes fonctions login et logout de mon MembresController sont réécrites comme ceci :

function membres_login()
    {
        $this->set("title_for_layout", "Connexion - Clavier Viande");

        if($this->Session->check('Auth.Member.id'))
        {
            if($this->Session->check('Auth.redirect'))
            {
                $this->redirect($this->Session->read('Auth.redirect'));
            }
            $redir = $this->referer();
            if($redir == $this->here)
            {
                $redir = $this->AppAuth->loginRedirect;
            }
            $this->redirect($redir);
        }
    }

    function membres_logout()
    {
        $this->Session->setFlash('Vous êtes déconnecté.', 'flash_ok');
        $this->redirect($this->AppAuth->logout());
    }

Mais pas celles de UsersController :

function admin_login()
    {
        $this->layout='admin_login';
        $this->set("title_for_layout", "Connexion - Administration");
    }

    function admin_logout()
    {
        $this->Session->setFlash('Vous êtes déconnecté.', 'flash_ok');
        $this->redirect($this->AppAuth->logout());
    }
}

Voilà, j'espère que ça va te débloquer ;)

Hébé un grand merci à toi Guiguiwuip, t'es amazing :)

Tu m'as débloqué et je t'en suis infiniment reconnaissant.

J'ai adapté mes routes et ça passe tout redirige à souhait le tout à l'air de marcher sur Cake2 à voir pour la suite.

Router::connect('/mtadmin451', array('controller' => 'users', 'action' => 'login', 'prefix' => 'mtadmin451','admin'=> true));
Router::connect('/users/login', array('controller' => 'users', 'action' => 'login','prefix' => 'mtadmin451','admin' => true));
Router::connect('/customers', array('controller' => 'customers', 'action' => 'login', 'prefix' => 'customers','customers' => true));
Router::connect('/customers/login', array('controller' => 'customers', 'action' => 'login', 'prefix' => 'customers','customers' => true));

J'suis tellemin'contente lâ :)

Mercish ;)

Content que tu t'en sois sortit !
Avec plaisir ;)