Вход в систему с использованием других полей с использованием аутентификации в cakephp3

#cakephp-3.0

#cakephp-3.0

Вопрос:

Проблема, связанная с входом в систему с использованием аутентификации в cakephp3

 $this->loadComponent('Auth', [
            'loginRedirect' => [
                'controller' => 'Articles',
                'action' => 'index'
            ],
            'logoutRedirect' => [
                'controller' => 'Pages',
                'action' => 'display',
                'home'
            ]
        ]);
 

это позволяет мне использовать имя пользователя только по умолчанию, хорошо, если я хочу войти в систему с помощью электронной почты, которую я искал и получил это:
UserController.php

  public function login()
    {
        if ($this->request->is('post')) 
        {
            $this->Auth->config('authenticate', [
                    'Form' => [
                        'fields' => ['username' => 'email']
                    ]
                ]);
            $this->Auth->constructAuthenticate();
            $this->request->data['email'] = $this->request->data['username'];
            unset($this->request->data['username']);
            $user = $this->Auth->identify();
            if ($user) 
            {
                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__('Invalid username or password, try again'));
        }
    }
 

Я могу изменить поля с имени пользователя на адрес электронной почты и восстановить его, но что, если я захочу войти в систему с ID помощью field.

 $this->Auth->config('authenticate', [
                    'Form' => [
                        'fields' => ['username' => 'id']
                    ]
                ]);
 

Если я перейду с адреса электронной почты на идентификатор, это не позволит мне войти в систему. Должен ли я вместо этого использовать запросы then?

Ответ №1:

У меня только что была такая же проблема, и я решил ее так, используя CakePHP 3.3

Ваш AppController

 $this->loadComponent('Auth', [
    'authenticate' => [
        'Form' => [
            'fields' => [
                'username' => 'email',
            ]
        ]
    ],
    'loginAction' => [
        'controller' => 'Users',
        'action' => 'login'
    ],
    'unauthorizedRedirect' => $this->referer(),
    'loginRedirect' => [
        'plugin' => false,
        'controller' => 'Pages',
        'action' => 'home',
    ],
]);
 

Ваш пользовательский контроллер (действие входа)

 /**
 * @return Response|null
 */
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.');
    }
}
 

Ваши основные пользователи / шаблон login.ctp

 <?= $this->Form->create() ?>
<?= $this->Form->input('email') ?>
<?= $this->Form->input('password') ?>
<?= $this->Form->button('Login') ?>
<?= $this->Form->end() ?>
 

Ответ №2:

Ваша проблема в том, что когда вы изменили поле «email» на «id» в приведенном ниже коде,

 `('authenticate', ['Form' => ['fields' => ['username' => 'id']]]);`
 

вы должны были изменить поле ввода вашего представления «login.ctp».

из этого: <?= $this->Form->input('email') ?>

для этого: <?= $this->Form->input('id') ?>