Bonjour,

Voilà je viens vers vous car je voudrai mettre en place le système d'authentification mais cette fois-ci sur l'ensemble du site (et pas seulement sur le panel administrateur comme dans le tuto). C'est à dire que dès que l'utilisateur souhaite se connecter au site, une demande d'authentification est appelée.
Dans le tuto, la demande d'authentification ce fait surtout par la détection du préfix "admin" dans la requête utilisateur, or dans mon cas je voudrai sur tout le site (donc pas de préfix précis)...
Si quelqu'un aurait une idée et me montrer comment faire, ce serai sympathique de sa part :)

Merci d'avance.
mLz.

14 réponses


mLz
Auteur

Bonjour à tous,

mon topic n'inspire personne ? :)

Dans mon fichier hook.php qui ressemble actuellement à:

<?php
if($this->request->prefix == 'admin'){
    $this->layout = 'admin'; 
    if(!$this->Session->isLogged() || $this->Session->user('role') != 'admin'){
        //echo $this->Session->addDaysDate($this->Session->user('created'),$this->Session->user('license')); die;
        $this->redirect('users/login'); 
    }
}
?>

J'ai essayé de supprimer le test du prefix afin que l'ensemble du site nécessite une authentification mais je me retrouve directement une une erreur de boucle infinie...

Any ideas ? :)

un truc comme ca?

<?php
if( $this->request->prefix != 'login' ){
    if( !$this->Session->isLogged() ){
        $this->redirect('users/login');
    } 
}
?>

En supposant que tu prefixes l'url pour se logger avec login. De cette manière pas de boucle infinie.

Bonsoir.
Il te suffit simplement de faire une fonction de connexion qui connectera l'utilisateur.
Dans ton cas tu n'as pas besoin de faire une vérification sur le préfix dans l'URL, sauf pour vérifier que lorsque le préfix admin est appelé dans l'URL que l'utilisateur à bien un rôle d'admin, pour permettre de sécuriser ton BackOffice.
Si Grafikart a fait une vérification du préfix et forcer la connexion par rapport à ça, c'était uniquement parce que le système ne permettait l'identification que pour les admins et que par conséquent le BackOffice était sécurisé uniquement par l'identification.
Par contre, je ne vais pas te dire comment connecter l'utilisateur, c'est à toi de le faire avec ce que tu as appris dans le tutoriel, car les tutoriels ne sont pas juste fait pour avoir un code déjà tout fait, mais pour apprendre la logique et le fonctionnement.
Par contre, ce que tu veux dans ton premier post et le second sont des choses différentes, pour la première c'est ce que j'ai mis au dessus, mais pour la seconde, tu fais une vérification sur l'existence de session, si ce n'est pas le cas, tu rediriges vers l'action de connexion.

mLz
Auteur

Déjà merci pour vos réponses :)

@Vallyan: J'ai effectivement déjà essayé le code que tu m'as montré -> Boucle infinie :/

@Lartak11: Mon but est dès que l'utilisateur accède au site, il soit redirigé vers la demande d'authentification (quelque soit la page)
Pour cela j'avais effectué le test pour savoir si l'utilisateur est actuellement connecté (avec isLogged()) mais toujours boucle infinie... j'ai l'impression de tourner un peu en rond (pourtant dans le fond ça ma l'air correct).

<?php
if(!$this->Session->isLogged()){
    $this->redirect('users/login'); 
}
?>

La truc c'est de faire une première condition qui vérifie si l'adresse demandée est le login (la page de check du login), puis une seconde qui requiert l'authorisation pour tout le reste. Je ne sais pas comment c'est pour ton MVC, mais <u>la page de login ET la page de vérification du login doivent être en dehors de la zone protégée</u>. Si tu as une boucle infinie c'est uniquement parce que tu n'évalues pas tes routes demandées correctement.

if( ($this->request == 'users/login') || ($this->request == 'users/check') ){ // JE NE CONNAIS PAS LA SYNTHAXE POUR TON MVC, METS CE QUE TU DOIS METTRE
    / **do nothing** /
}
elseif( !$this->Session->isLogged() ){
    $this->redirect('users/login'); 
}

Bonjour,

voilà ce que je te propose :
Dans AppController tu fais une fonction beforeFilter :

public function beforeFilter() {
        parent::beforeFilter();
        //La page de login par défaut
        $this->Auth->loginAction = array('controller' => 'users',
            'action' => 'login',
            'admin' => false);
        //La vérification se fait par controller
        $this->Auth->authorize = array('Controller');
}

Superbement,
ccvf2s.

@Lartak11: Mon but est dès que l'utilisateur accède au site, il soit redirigé vers la demande d'authentification (quelque soit la page)
Pour cela j'avais effectué le test pour savoir si l'utilisateur est actuellement connecté (avec isLogged()) mais toujours boucle infinie... j'ai l'impression de tourner un peu en rond (pourtant dans le fond ça ma l'air correct).

J'avais bien compris, c'est bien pour ça que j'ai mis

tu fais une vérification sur l'existence de session, si ce n'est pas le cas, tu rediriges vers l'action de connexion

Seulement, j'ai relevé que tu disais deux choses différentes entre tes 2 premiers posts.
Par contre, tu ne te serais pas trompé de forum par hasard ?
Car vu ton code on dirait que c'est pour CakePHP, alors qu'ici c'est le forum consacré uniquement au PHP et non à CakePHP.

mLz
Auteur

@Vallyan: J'ai eu beau retester ton code, où faire tous les tests possibles (sur les prefix ou autres) mais rien n'y fait...

@ccvf2s: Tu m'as perdu là :) je sais pas si tu fait référence à un Framework comme CakePHP ou autre mais je n'ai auncunement des fichiers tels que AppController ou des méthodes tels que LoginAction ou Authorize :)

@Lartak11: Non non ce n'est pas du CakePHP (je n'ai jamais testé ou étudier ce Framework)... :)

Sinon merci à vous d'essayer de me sortir de là, c'est sympa de votre part ;)

Bonsoir.
Oui il fait référence à CakePHP, c'est pour ça que je pensais que tu t'étais trompé de forum et que tu faisais allusion à du code utilisé pour CakePHP.
Désolé. :(

mLz
Auteur

Bonsoir,

Pas de soucis Lartak11 ;)
Sinon je patauge toujours autant lol

mLz
Auteur

J'ai finalement réussi à faire ce que je souhaitais.
Je poste le code de mon fichier hook.php au cas ou... (même si le code n'est surement pas très "pro" mais bon)

<?php
if(($this->request->url != "/users/login") && (!$this->Session->isLogged())){
    $this->redirect('users/login'); 
}
elseif($this->Session->isLogged()){
    if(($this->request->prefix == 'admin')&&($this->Session->user('role') != 'admin')){
        $this->redirect(''); 
    }
    elseif (($this->request->prefix == 'admin')&&($this->Session->user('role') == 'admin')) {
        $this->layout = 'admin'; 
    }
}
?>

Je test par rapport à l'url souhaité (si l'utilisateur n'est pas connecté et que l'url est différent de la page d'authentification)
Ensuite je test le rôle de l'utilisateur.

Voila :)

slu mLz

je pense personnellement que cette condition

if($this->request->url != "/users/login")

ne tient pas compte de toutes les situations(presence de querystring par exemple).
aussi je trouve anormal qu'un utilisateur(ordinaire) connecté utilise un prefix admin et que tu le laisses parcourir le site , même s'il reste bloqué sur la page d'accueil. il s'agit surremnt de quelqu'un qui essaye de hacker le site, alors il faut lui rendre les choses plus compliquées. et je pense même qu'apres un certains nombre d'essais son ip devrait etre bloqué(mais le code ci-dessous ne le fait pas).

if(!$this->Session->isLogged())
    if($this->request->controller !== 'users' or $this->request->action !== 'login')
    $this->redirect('/users/login');
//ici on est deja connecté
if($this->request->prefix === 'admin')
{
    $this->layout = 'admin';
    //$this->Session->setAttr('timeout',10);
    if($this->Session->user('role') !== 'admin')
        {
        $this->Session->logout();
        $this->redirect('/users/login');
        } 
}
mLz
Auteur

@iriven: Merci bien pour ta réponse et pour ta proposition de code :)
Oui effectivement tu as raison pour la présence de querystring (j'avais complètement oublié...)
Qu'entends-tu par "lui rendre les choses plus compliques" ?
Puis comment bloquer un utilisateur selon son IP ? (rentrer son ip dans un fichier puis lors du login parcourir le fichier pour vérifier si l'IP ne s'y trouve pas ? ainsi que mettre un "compteur d'essais" ? :p)
Merci d'avance.

vu qu'il a eu besoin de se connecter pour tenter de voler les droits admin, alors lui compliquer la tache consistera à le déconnecter et l'obliger à se reconnecter.
pour le blocage de l'ip ta solution est exacte.
mais pas besoin de modifier le systeme de login sauf qu'avant d'ecrire ceci:

if(!$this->Session->isLogged())
    if($this->request->controller !== 'users' or $this->request->action !== 'login')
    $this->redirect('/users/login');

tester si son ip n'est pas blacklisté, auquel cas tu fais un

die($message);

, là il n'a même pas accès au formulaire.