2016-07-21 9 views
0

Ich habe dieses Problem mehrmals festgestellt und versucht, dies zu vermeiden, indem ich die aufrufende Flash-Methode lösche. In letzter Zeit möchte ich einen Fehler bei nicht eingeloggten Benutzern anzeigen, der versucht sich abzumelden. Wenn ich diese Aktion jedoch teste (indem ich auf localhost: 8765/users/logout zugreife, ohne eingeloggt zu sein), funktioniert alles einwandfrei, außer dass ich zwei Fehlermeldungen erhalte: "Sie sind nicht berechtigt, auf diesen Standort zuzugreifen". Wie kann ich dieses Problem beheben?Flash-Nachricht wird zweimal in einer Ansicht angezeigt CakePHP3

Hier sind meine Codes

In 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; 
} 

In 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()); 
} 

In UsersTable

public function selfUser($targetedUserId, $userId) 
{ 

    return $targetedUserId == $userId; 
} 

In 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> 

In 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> 

Antwort

1

Könnten Sie auch selbst nur einen Auszug aus dem CTP-Datei veröffentlichen? Es könnte sein, dass der Flash innerhalb des Seitenlayouts doppelt gerendert wurde.

+0

Können Sie mir den Dateinamen und sein Verzeichnis geben? Meinst du die default.ctp im Layout-Ordner? –

+0

Das hängt davon ab, wo Sie die Flash-Nachricht gerendert haben. Sie könnten versuchen, nach der Zeile zu suchen: "$ this-> Flash-> render()" in Ihrem default.ctp. Es könnte auch in der CTP-Datei für Ihren Anmeldebildschirm sein. Versuchen Sie im Grunde, nach der Codezeile zu suchen, die ich erwähnt habe, und sehen Sie, ob sie zweimal hinzugefügt wurde. Es könnte auch möglich sein, dass Sie den Code sowohl Ihrer default.ctp- als auch der ctp-Datei für Ihre Anmeldung hinzugefügt haben. –

+0

Ich sah ein $ this-> Flash-> render() in default.ctp. Wenn also ein $ this-> Flash-> error() in UsersController ausgeführt wird, löst es auch $ this-> Flash-> render() in default.ctp aus? Sollte ich $ this-> Flash-> render() löschen oder irgendwie die $ this-> Flash-> error() in UsersController ändern, um dieses Problem zu beheben? –

Verwandte Themen