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>
Können Sie mir den Dateinamen und sein Verzeichnis geben? Meinst du die default.ctp im Layout-Ordner? –
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. –
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? –