代码之家  ›  专栏  ›  技术社区  ›  ChrisB

CakePHP教程错误:对/users的请求没有应用任何授权检查

  •  0
  • ChrisB  · 技术社区  · 3 年前

    我得到了错误:

    The request to /users did not apply any authorization checks.

    当我试着跑步时 http://localhost:8765/users

    我以为我一步一步地正确地遵循了教程,但我很可能在某个地方错过了一些东西。开始调试此错误的好方法是什么?

    我的UsersController.php文件如下所示:

    declare(strict_types=1);
    
    namespace App\Controller;
    
    /**
     * Users Controller
     *
     * @property \App\Model\Table\UsersTable $Users
     * @method \App\Model\Entity\User[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
     */
    class UsersController extends AppController
    {
        
        public function beforeFilter(\Cake\Event\EventInterface $event)
        {
            parent::beforeFilter($event);
            // Configure the login action to not require authentication, preventing
            // the infinite redirect loop issue
            $this->Authentication->addUnauthenticatedActions(['login', 'add']);
        }
        
        public function login()
        {
            $this->request->allowMethod(['get', 'post']);
            $result = $this->Authentication->getResult();
            // regardless of POST or GET, redirect if user is logged in
            if ($result->isValid()) {
                // redirect to /articles after login success
                $redirect = $this->request->getQuery('redirect', [
                    'controller' => 'Articles',
                    'action' => 'index',
                ]);
    
                return $this->redirect($redirect);
            }
            // display error if user submitted and authentication failed
            if ($this->request->is('post') && !$result->isValid()) {
                $this->Flash->error(__('Invalid username or password'));
            }
            
            $this->Authorization->skipAuthorization();
        }
        
        /**
         * Index method
         *
         * @return \Cake\Http\Response|null|void Renders view
         */
        public function index()
        {
            $users = $this->paginate($this->Users);
            $this->set(compact('users'));
        }
    
        /**
         * View method
         *
         * @param string|null $id User id.
         * @return \Cake\Http\Response|null|void Renders view
         * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
         */
        public function view($id = null)
        {
            $user = $this->Users->get($id, [
                'contain' => ['Articles'],
            ]);
    
            $this->set(compact('user'));
        }
    
        /**
         * Add method
         *
         * @return \Cake\Http\Response|null|void Redirects on successful add, renders view otherwise.
         */
        public function add()
        {
            $this->Authorization->skipAuthorization();
            $user = $this->Users->newEmptyEntity();
            if ($this->request->is('post')) {
                $user = $this->Users->patchEntity($user, $this->request->getData());
                if ($this->Users->save($user)) {
                    $this->Flash->success(__('The user has been saved.'));
    
                    return $this->redirect(['action' => 'index']);
                }
                $this->Flash->error(__('The user could not be saved. Please, try again.'));
            }
            $this->set(compact('user'));
        }
    
        /**
         * Edit method
         *
         * @param string|null $id User id.
         * @return \Cake\Http\Response|null|void Redirects on successful edit, renders view otherwise.
         * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
         */
        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->getData());
                if ($this->Users->save($user)) {
                    $this->Flash->success(__('The user has been saved.'));
    
                    return $this->redirect(['action' => 'index']);
                }
                $this->Flash->error(__('The user could not be saved. Please, try again.'));
            }
            $this->set(compact('user'));
        }
    
        /**
         * Delete method
         *
         * @param string|null $id User id.
         * @return \Cake\Http\Response|null|void Redirects to index.
         * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
         */
        public function delete($id = null)
        {
            $this->request->allowMethod(['post', 'delete']);
            $user = $this->Users->get($id);
            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']);
        }
        
        // in src/Controller/UsersController.php
        public function logout()
        {
            $this->Authorization->skipAuthorization();
            $result = $this->Authentication->getResult();
            // regardless of POST or GET, redirect if user is logged in
            if ($result->isValid()) {
                $this->Authentication->logout();
                return $this->redirect(['controller' => 'Users', 'action' => 'login']);
            }
        }
    }
    

    我的Application.php是这样的:

    declare(strict_types=1);
    
    /**
     * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
     * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
     *
     * Licensed under The MIT License
     * For full copyright and license information, please see the LICENSE.txt
     * Redistributions of files must retain the above copyright notice.
     *
     * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
     * @link      https://cakephp.org CakePHP(tm) Project
     * @since     3.3.0
     * @license   https://opensource.org/licenses/mit-license.php MIT License
     */
    namespace App;
    
    use Cake\Core\Configure;
    use Cake\Core\ContainerInterface;
    use Cake\Core\Exception\MissingPluginException;
    use Cake\Datasource\FactoryLocator;
    use Cake\Error\Middleware\ErrorHandlerMiddleware;
    use Cake\Http\BaseApplication;
    use Cake\Http\Middleware\BodyParserMiddleware;
    use Cake\Http\Middleware\CsrfProtectionMiddleware;
    use Cake\Http\MiddlewareQueue;
    use Cake\ORM\Locator\TableLocator;
    use Cake\Routing\Middleware\AssetMiddleware;
    use Cake\Routing\Middleware\RoutingMiddleware;
    
    // Authentication
    use Authentication\AuthenticationService;
    use Authentication\AuthenticationServiceInterface;
    use Authentication\AuthenticationServiceProviderInterface;
    use Authentication\Middleware\AuthenticationMiddleware;
    use Cake\Routing\Router;
    use Psr\Http\Message\ServerRequestInterface;
    
    // Authorization
    use Authorization\AuthorizationService;
    use Authorization\AuthorizationServiceInterface;
    use Authorization\AuthorizationServiceProviderInterface;
    use Authorization\Middleware\AuthorizationMiddleware;
    use Authorization\Policy\OrmResolver;
    
    /**
     * Application setup class.
     *
     * This defines the bootstrapping logic and middleware layers you
     * want to use in your application.
     */
    class Application extends BaseApplication implements AuthenticationServiceProviderInterface, AuthorizationServiceProviderInterface {
        /**
         * Load all the application configuration and bootstrap logic.
         *
         * @return void
         */
        public function bootstrap(): void
        {
            // Call parent to load bootstrap from files.
            parent::bootstrap();
    
            if (PHP_SAPI === 'cli') {
                $this->bootstrapCli();
            } else {
                FactoryLocator::add(
                    'Table',
                    (new TableLocator())->allowFallbackClass(false)
                );
            }
    
            /*
             * Only try to load DebugKit in development mode
             * Debug Kit should not be installed on a production system
             */
            if (Configure::read('debug')) {
                $this->addPlugin('DebugKit');
            }
            
            $this->addPlugin('Authorization');
            
            // Load more plugins here
        }
    
        /**
         * Setup the middleware queue your application will use.
         *
         * @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup.
         * @return \Cake\Http\MiddlewareQueue The updated middleware queue.
         */
        public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
        {
            $middlewareQueue
                // Catch any exceptions in the lower layers,
                // and make an error page/response
                ->add(new ErrorHandlerMiddleware(Configure::read('Error')))
    
                // Handle plugin/theme assets like CakePHP normally does.
                ->add(new AssetMiddleware([
                    'cacheTime' => Configure::read('Asset.cacheTime'),
                ]))
    
                // Add routing middleware.
                // If you have a large number of routes connected, turning on routes
                // caching in production could improve performance. For that when
                // creating the middleware instance specify the cache config name by
                // using it's second constructor argument:
                // `new RoutingMiddleware($this, '_cake_routes_')`
                ->add(new RoutingMiddleware($this))
                ->add(new AuthenticationMiddleware($this))
                ->add(new AuthorizationMiddleware($this))
    
                // Parse various types of encoded request bodies so that they are
                // available as array through $request->getData()
                // https://book.cakephp.org/4/en/controllers/middleware.html#body-parser-middleware
                ->add(new BodyParserMiddleware())
    
                // Cross Site Request Forgery (CSRF) Protection Middleware
                // https://book.cakephp.org/4/en/controllers/middleware.html#cross-site-request-forgery-csrf-middleware
                ->add(new CsrfProtectionMiddleware([
                    'httponly' => true,
                ]));
    
            return $middlewareQueue;
        }
    
        public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
        {
            $authenticationService = new AuthenticationService([
                'unauthenticatedRedirect' => Router::url('/users/login'),
                'queryParam' => 'redirect',
            ]);
    
            // Load identifiers, ensure we check email and password fields
            $authenticationService->loadIdentifier('Authentication.Password', [
                'fields' => [
                    'username' => 'email',
                    'password' => 'password',
                ]
            ]);
    
            // Load the authenticators, you want session first
            $authenticationService->loadAuthenticator('Authentication.Session');
            // Configure form data check to pick email and password
            $authenticationService->loadAuthenticator('Authentication.Form', [
                'fields' => [
                    'username' => 'email',
                    'password' => 'password',
                ],
                'loginUrl' => Router::url('/users/login'),
            ]);
    
            return $authenticationService;
        }
    
        /**
         * Register application container services.
         *
         * @param \Cake\Core\ContainerInterface $container The Container to update.
         * @return void
         * @link https://book.cakephp.org/4/en/development/dependency-injection.html#dependency-injection
         */
        public function services(ContainerInterface $container): void
        {
        }
    
        /**
         * Bootstrapping for CLI application.
         *
         * That is when running commands.
         *
         * @return void
         */
        protected function bootstrapCli(): void
        {
            try {
                $this->addPlugin('Bake');
            } catch (MissingPluginException $e) {
                // Do not halt if the plugin is missing
            }
    
            $this->addPlugin('Migrations');
    
            // Load more plugins here
        }
        
        public function getAuthorizationService(ServerRequestInterface $request): AuthorizationServiceInterface
        {
            $resolver = new OrmResolver();
    
            return new AuthorizationService($resolver);
        }
    }
    
    

    我没看到什么?谢谢

    0 回复  |  直到 3 年前
        1
  •  2
  •   sujit    2 年前

    在atricles&用户控制器

    $this->授权->skipAuthorization();