2016-09-28 11 views
0

Мне нужно отфильтровать запросы json и разрешить базовую аутентификацию для этих запросов, разрешая только проверку подлинности только для html-запросов. Когда я фильтровать запросы в моей функции инициализации в AppController.php:Как использовать базовую аутентификацию для запросов json и проверку подлинности формы для html-запросов с помощью Cakephp 3?

if ($this->request->is('json')) { 
     $this->loadComponent('Auth', [ 
      'authorize' => ['Controller'], 
      'authenticate' => [ 
       'Basic' => [ 
        'fields' => ['username' => 'email', 'password' => 'password'], 
        'contain' => ['Districts'] 
       ] 
      ] 
     ]); 
    } else { 
     $this->loadComponent('Auth', [ 
      'authorize' => ['Controller'], 
      'authenticate' => [ 
       'Form' => [ 
        'fields' => ['username' => 'email', 'password' => 'password'], 
        'contain' => ['Districts'] 
       ] 
      ], 
      'loginAction' => [ 
       'controller' => 'Users', 
       'action' => 'login' 
      ], 
      'logoutRedirect' => [ 
       'controller' => 'Users', 
       'action' => 'login' 
      ] 
     ]); 
    } 

запрос JSON создает и сохраняет сеанс, позволяющий пользователю получить доступ к остальной части сайта, в том числе HTML запросов, поскольку он имеет авторизованный сеанс , Я изо всех сил пытался найти то, что вызывало это, и в итоге обнаружил, что вам нужно явно объявить, что носитель данных для метода базовой аутентификации «Память». Я поставлю правильный код в своем ответе ниже.

Этот вопрос похож на этот один для CakePHP 2: CakePHP form authentication for normal requests with basic authentication for JSON

ответ

1

Вы должны явно объявить, что базовая аутентификация использует память для носителя данных, или же он будет создать сеанс. Вот правильный код:

if ($this->request->is('json')) { 
     $this->loadComponent('Auth', [ 
      'authorize' => ['Controller'], 
      'authenticate' => [ 
       'Basic' => [ 
        'fields' => ['username' => 'email', 'password' => 'password'], 
        'contain' => ['Districts'] 
       ] 
      ], 
      'storage' => 'Memory' 
     ]); 
    } else { 
     $this->loadComponent('Auth', [ 
      'authorize' => ['Controller'], 
      'authenticate' => [ 
       'Form' => [ 
        'fields' => ['username' => 'email', 'password' => 'password'], 
        'contain' => ['Districts'] 
       ] 
      ], 
      'loginAction' => [ 
       'controller' => 'Users', 
       'action' => 'login' 
      ], 
      'logoutRedirect' => [ 
       'controller' => 'Users', 
       'action' => 'login' 
      ] 
     ]); 
    }