2016-07-21 2 views
0

J'ai rencontré ce problème plusieurs fois et j'ai essayé de l'éviter en supprimant la méthode Flash appelant. Dernièrement, je veux montrer une erreur flash à l'utilisateur non connecté qui essaie de se déconnecter. Cependant, lorsque je teste cette action (en accédant à localhost: 8765/users/logout sans être connecté), tout fonctionne correctement sauf que j'ai 2 messages d'erreur "Vous n'êtes pas autorisé à accéder à cet emplacement". Comment puis-je résoudre ce problème?Message Flash affiché deux fois dans une vue CakePHP3

Voici mes codes

En AppController:

public function initialize() 
{ 
    parent::initialize(); 

    $this->loadComponent('RequestHandler'); 
    $this->loadComponent('Flash'); 
    $this->loadComponent('Auth', [ 
     'authorize' => ['Controller'], //For User authorize checking, this tells app to let each controller decides own rules for authorize 
     'loginRedirect' => ['controller' => 'Articles', 'action' => 'index'], 
     'logoutRedirect' => ['controller' => 'Users', 'action' => 'index'] 
    ]); 
} 

public function beforeFilter(Event $event) 
{ 
    //this applied to every controller 
    $this->Auth->allow(['index', 'view', 'display']); 
} 

    ... 

public function isAuthorized($user) 
{ 
    //Admin can access every action 
    if(isset($user['role']) && $user['role'] === 'admin'){ 
     return true; 
    } 

    //Default deny 
    return false; 
} 

En UsersController:

public function isAuthorized($user) 
{ 
    //All registered users can add articles 
    if($this->request->action === 'add'){ 
     return true; 
    } 

    //The self user can edit and delete the account 
    if(in_array($this->request->action, ['edit', 'delete'])){    
     //get id of targeted user 
     $targetUserId = (int)$this->request->params['pass'][0]; 
     //check if current user is the targeted user 
     if($this->Users->selfUser($targetUserId, $user['id'])){ 
      return true; 
     }else{ 
      $this->Flash->error(__('You are not authorized for this action')); 
     } 
    } 
    return parent::isAuthorized($user); 
} 

public function beforeFilter(Event $event) 
{ 
    parent::beforeFilter($event); 
    $this->Auth->allow(['add']); 
} 

... 

public function logout() 
{ 
    return $this->redirect($this->Auth->logout()); 
} 

En UsersTable

public function selfUser($targetedUserId, $userId) 
{ 

    return $targetedUserId == $userId; 
} 

En default.ctp

$cakeDescription = 'CakePHP: the rapid development php framework'; 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <?= $this->Html->charset() ?> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title> 
     <?= $cakeDescription ?>: 
     <?= $this->fetch('title') ?> 
    </title> 
    <?= $this->Html->meta('icon') ?> 

    <?= $this->Html->css('base.css') ?> 
    <?= $this->Html->css('cake.css') ?> 

    <?= $this->fetch('meta') ?> 
    <?= $this->fetch('css') ?> 
    <?= $this->fetch('script') ?> 
</head> 
<body> 
    <nav class="top-bar expanded" data-topbar role="navigation"> 
     <ul class="title-area large-3 medium-4 columns"> 
      <li class="name"> 
       <h1><a href=""><?= $this->fetch('title') ?></a></h1> 
      </li> 
     </ul> 
     <div class="top-bar-section"> 
      <ul class="right"> 
       <li><a target="_blank" href="http://book.cakephp.org/3.0/">Documentation</a></li> 
       <li><a target="_blank" href="http://api.cakephp.org/3.0/">API</a></li> 
      </ul> 
     </div> 
    </nav> 
    <?= $this->Flash->render() ?> 
    <div class="container clearfix"> 
     <?= $this->fetch('content') ?> 
    </div> 
    <footer> 
    </footer> 
</body> 
</html> 

Dans login.ctp

<div class="users form"> 
<?= $this->Flash->render('auth') ?> 
<?= $this->Form->create() ?> 
    <fieldset> 
     <legend><?= __('Please enter your username and password') ?></legend> 
     <?= $this->Form->input('username') ?> 
     <?= $this->Form->input('password') ?> 
    </fieldset> 
<?= $this->Form->button(__('Login')); ?> 
<?= $this->Form->end() ?> 
</div> 

Répondre

1

Pourriez-vous aussi poster même que d'un extrait de votre fichier CTP? Il pourrait être possible que dans la mise en page, le Flash a été rendu deux fois.

+0

Pouvez-vous me donner le nom du fichier et son répertoire? Voulez-vous dire le fichier default.ctp dans le dossier Layout? –

+0

Cela dépend en fait de l'endroit où vous avez rendu le message Flash. Vous pouvez essayer de chercher la ligne: "$ this-> Flash-> render()" dans votre fichier default.ctp. Il pourrait également être dans le fichier CTP pour votre écran de connexion. Fondamentalement, essayez de chercher la ligne de code que j'ai mentionné et voir si elle a été ajoutée deux fois. Il est également possible que vous ayez ajouté le code à votre fichier default.ctp et au fichier ctp pour votre connexion elle-même. –

+0

J'ai vu un $ this-> Flash-> render() dans default.ctp. Ainsi, quand une erreur $ this-> Flash->() est exécutée dans UsersController, elle déclenche également le $ this-> Flash-> render() dans default.ctp? Devrais-je supprimer $ this-> Flash-> render() ou modifier d'une façon ou d'une autre l'erreur $ this-> Flash->() dans UsersController pour résoudre ce problème? –