CakePHP 3: пользователям не разрешено выходить из системы?

Я изучаю cakePHP 3, чтобы подать заявку на стажировку, и в настоящее время я следую руководству из Официальная кулинарная книга с сайта cakePHP.org, но я ненавижу эту книгу. Это очень запутанно.

В любом случае, я выполнил шаги примера Bookmarker, и он вроде как работает, и я сделал все так, как мне было сказано в книге, до раздела входа и выхода, но когда я пытаюсь выйти из системы, он говорит мне, что «Вы не авторизованы чтобы получить доступ к этому местоположению».

Если вам нужен дополнительный код из моего проекта, пожалуйста, дайте мне знать.

Чтобы выйти из системы, я направляю пользователей с помощью следующего кода, который создает гиперссылку на server/users/logout:

<?= $this->Html->link(__('Log out'), ['controller' => 'Users', 'action' => 'logout']) ?>

/rootOfProject/src/Controller/AppController.php:

namespace App\Controller;
use Cake\Controller\Controller;

class AppController extends Controller {
    public function initialize() {
        $this->loadComponent('Flash');
        $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ]
                ]
            ],
            'unauthorizedRedirect' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
            'authorize' => 'Controller'
        ]);
        $this->Auth->allow(['display']);
    }
    public function isAuthorized($user) {
        return false;
    }
}

/rootOfProject/src/Controller/UsersController.php:

namespace App\Controller;
use App\Controller\AppController;
class UsersController extends AppController {
    public function index() {
        $this->set('users', $this->paginate($this->Users));
    }
    public function view($id = null) {
        $user = $this->Users->get($id, [
            'contain' => ['Bookmarks']
        ]);
        $this->set('user', $user);
    }
    public function add() {
        $user = $this->Users->newEntity($this->request->data);
        if ($this->request->is('post')) {
            if ($this->Users->save($user)) {
                $this->Flash->success('The user has been saved.');
                return $this->redirect(['action' => 'index']);
            } else {
                $this->Flash->error('The user could not be saved. Please, try again.');
            }
        }
        $this->set(compact('user'));
    }
    public function edit($id = null) {
        $user = $this->Users->get($id, [
            'contain' => []
        ]);
        if ($this->request->is(['patch', 'post', 'put'])) {
            $user = $this->Users->patchEntity($user, $this->request->data);
            if ($this->Users->save($user)) {
                $this->Flash->success('The user has been saved.');
                return $this->redirect(['action' => 'index']);
            } else {
                $this->Flash->error('The user could not be saved. Please, try again.');
            }
        }
        $this->set(compact('user'));
    }
    public function delete($id = null) {
        $user = $this->Users->get($id);
        $this->request->allowMethod(['post', 'delete']);
        if ($this->Users->delete($user)) {
            $this->Flash->success('The user has been deleted.');
        } else {
            $this->Flash->error('The user could not be deleted. Please, try again.');
        }
        return $this->redirect(['action' => 'index']);
    }
    public function login() {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
            if ($user) {
                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error('Your username or password is incorrect.');
        }
    }
    public function logout() {
        $this->Flash->success('You are now logged out.');
        return $this->redirect($this->Auth->logout());
    }
    public function beforeFilter(\Cake\Event\Event $event) {
        $this->Auth->allow(['add']);
    }
}

person Gui Imamura    schedule 01.12.2014    source источник
comment
Кому интересно, я изменил код с $this->Auth->allow(['add']) на $this->Auth->allow(['add', 'logout']) внутри метода beforeFilter в UsersControllers.php, и это сработало. Большое спасибо @ndm   -  person Gui Imamura    schedule 01.12.2014


Ответы (2)


Вы запрещаете доступ всем пользователям с помощью обратного вызова isAuthorized(), который просто возвращает false. Следовательно, будут доступны только явно разрешенные действия ($this->Auth->allow()), а также неявно разрешенное действие входа в систему.

Если вы не хотите реализовывать какие-либо проверки авторизации (аутентификация != авторизация), удалите обратный вызов из вашего контроллера, а также параметр authorize из конфигурации компонента аутентификации.

См. http://book.cakephp.org/3.0/en/controllers/components/authentication.html#authorization для получения дополнительной информации об авторизации.

person ndm    schedule 01.12.2014
comment
Ok. Автор книги отметил, что студент должен запрещать все доступы и явно разрешать те, которые он хотел, но не сказал, как разрешить доступ. Книга просто бросает мне коды, говорит мне копировать и вставлять что-то и ожидает, что я пойму что-то естественным образом. Большое спасибо. - person Gui Imamura; 01.12.2014

В вашем AppController добавьте следующее:

<?php
    public function isAuthorized($user)
    {
        $action = $this->request->params['action'];

        // The add and index actions are always allowed.
        if (in_array($action, ['logout'])) {
            return true;
        }else{
            return false;
        }
}
?>
person raffi    schedule 14.11.2015