Bonjour,
J'ai créer une administration pour mon site web, Je veux seulement que les utilisateurs qui ont le role "admin" ont accès à l'administration.

J'ai fait un AppController dans un dossier admin :
src -> controller -> admin -> AppController

J'ai cette stucture dans mon fichier AppController :

namespace App\Controller\Admin;
use App\Controller\Admin\AppController as Controller;

class AppController extends Controller
{
    /**
     * Initialization hook method.
     *
     * Use this method to add common initialization code like loading components.
     *
     * @return void
     */
    public function initialize()
    {
        parent::initialize()l
        $this->loadComponent('Auth',[
            'authorize' => 'Controller'
        ]);
    }

    public function isAuthorized($user)
    {
        if (isset($user['role']) && $user['role'] === 'admin') {
           return true;
        }
        return false;
    }
}

Le problème est que les membre qui ne sont pas admin on accès à l'administration. Je veux les bloqué l'accès car leurs compte n'a pas le role admin.

Merci

16 réponses


lakamark
Auteur
Réponse acceptée

Merci j'ai trouver le bug
Dans mon tout mes controller il faut qu'il charge le bon appController

use App\Controller\AppController;

par :

use App\Controller\Admin\AppController;

Petite oublie de ma part.

Essaye ceci Comme dans la doc:

'authorize' => ['Controller'], 

Bonjour.
Dis moi, c'est quoi ça ?

namespace App\Controller\Admin;
use App\Controller\Admin\AppController as Controller;

class AppController extends Controller

Tu ne peux pas faire étendre ta classe active par celle-ci.
Fais plutôt :

namespace App\Controller\Admin;
use Cake\Core\Controller\Controller;

class AppController extends Controller

Ce qui aura pour effet de l'étendre du controller du core de CakePHP.
Par contre, si tu veux l'étendre de ton AppController qui se situe dans src/Controller/, tu peux faire dans ce cas là par exemple :

namespace App\Controller\Admin;
use App\Controller\AppController as BaseController;

class AppController extends BaseController
lakamark
Auteur

@Lartak : J'ai des controllers qui sont src/Controller/Admin/
C'est pour ça que j'ai fait un appController pour sécurisé l'accès à ces controller. c'est seulement les utilisateur qui sont role admin qui ont accès.

Sauf que là, tu fais appel au controller actuel.
C'est le controller AppController qui est dans le prefix Admin.

lakamark
Auteur

En utilisant une l'une de tes deux solution. Quest que je fait quand l'utilisateur n'est pas connecter. Il me redireige admin/users/login et moi je veux qui le redirige vers users/login. La page que tout les utilisateur ce connecte.

J'ai mondifier

namespace App\Controller\Admin;
use Cake\Core\Controller\Controller;

class AppController extends Controller

Il faut surement que je recharge le composant Auth

$this->loadComponent('Auth', [
            'authorize' => ['controller'],
            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login',
            ],
            'authenticate' => [
                'Form' => [
                    'fields' => ['username' => 'email']
                ]
            ]
        ]);

J'ai faite une fonction isAuthorized();
Qui vérifie si l'utilisateur est connecté et qui il a le role admin

public function isAuthorized($user)
    {
        if (isset($user['role']) && $user['role'] === 'admin') {
           return true;
        }
        return false;

    }

La fonction ne fonctionne pas.

Dans le composant Auth, tu peux ajouter dans loginAction:

'prefix' => false

Soit :

'loginAction' => ['controller' => 'Users', 'action' => 'login', 'prefix' => false]
lakamark
Auteur

J'ai ajouté le prefix = false dans loginAction et ça ne fonctionne pas.

En fait la fonction initialize(); n'est même pas appeller tout mon code ne fonctionne pas

lakamark
Auteur

Est-ce que je fait pas la bonne façons pour créer une administration sur cakphp 3?

Tu veux bien reposter le contenu de ton Controller, c'est un peu dur de savoir où tu en es ...

lakamark
Auteur

@antograssiot Voici où je suis rendu dans mon appController :

<?php
namespace App\Controller\Admin;

use Cake\Core\Controller\Controller;
/**
 * App Controller
 *
 * @property \App\Model\Table\AppTable $App
 */
class AppController extends Controller
{
    /**
     * Initialization hook method.
     *
     * Use this method to add common initialization code like loading components.
     *
     * @return void
     */
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('Flash');
        $this->loadComponent('Cookie');
        $this->loadComponent('RequestHandler');
        $this->loadComponent('Auth', [
        'authorize' => ['Controller'], // Ajout de cette ligne
        'loginRedirect' => [
            'controller' => 'Users',
            'action' => 'login',
            'prefix' => false
            ]
        ]);
    }

    public function beforeFilter()
    {
        die('teste');
    }

    public function canUploadMedias($model, $id)
    {
        return true;
    }

    public function isAuthorized($user)
    {
        // Admin peuvent accéder à chaque action
        if (isset($user['role']) && $user['role'] === 'admin') {
            return true;
        }

        // Par défaut refuser
        return false;
        }
}

Et avec (dans ton loginRedirect) un 'admin'=> fasle à la place du prefix ça donne quoi?

@BenFarhat Cela est normalement inutile dans Cake 3 il me semble.

@musicalitymaker Je ne peux pas tester ton code pour le moment mais montre un exemple de Controller dans ta partie Admin ainsi que tes routes. Le beforeFilter devrait envoyer une erreur car il attend un Cake\Event\Event en parametre ce qui me fait dire que cet AppController n'est pas utilisé...

lakamark
Auteur

@antograssiot J'ai mis un beforeFilter(); ne retourne même pas d'erreur et qui'il devrais y avoir une erreur. Je pense que mes autres controllers (PostsController, Tracks,Controller) ne sont pas correctement attacher à AppController de mon administration.

As-tu pensé à ajouter ton prefix dans le routing ?

lakamark
Auteur

@Lartak: Oui j'ai ajouté le prefix dans le routing et ça me redirige bien à la bonne action. Je n'est plus d'erreur tout fonctionne très bien.