CakePHP:登录 2 个表

CakePHP: Login over 2 tables

我有一个具有新数据库结构的 CakePHP 网站,我想重新配置登录。首先这是我的错误 Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Users.email' in 'where clause'.

我有 2 个 Table 通过 UUID 字段连接。

Users Userdata
ID ID
UUID UUID
password email

在旧网站中,电子邮件和密码在同一个 table 但现在不是了。我用插件 bake 创建了 Table / 实体。最后,我在 UsersTable.php 上设置了 $this->hasOne('Userdata');,在 UserdataTable.php 上设置了 $this->hasOne('Users');

UserdataTable.php

<?php
namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

class UserdataTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('userdata');
        $this->setDisplayField('ID');
        $this->setPrimaryKey('ID');
        $this->hasOne('Users');
    }
}

UserTable.php

<?php
namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

class UsersTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('users');
        $this->setDisplayField('ID');
        $this->setPrimaryKey('ID');
        $this->hasOne('Userdata');
    }
}

这是我的 AppController.php

        $this->loadComponent('Auth', [
            'authorize'=> 'Controller',
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ]
                ]
            ],
            'loginAction' => [
                'controller' => 'Users',
                'action' => 'login'
            ],
             //use isAuthorized in Controllers
            'authorize' => ['Controller'],
             // If unauthorized, return them to page they were just on
            'unauthorizedRedirect' => $this->referer()
        ]);

然后在我的 UsersController.php

    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.');
        }
    }

我使用的是 CakePHP 版本 3.6.15

您在这里需要的是自定义查找器,以便您可以修改用于查找用户记录的查询。

最简单、最向前兼容的方法可能是在查询中简单地包含 Userdata 关联,并配置表单验证器的 username 选项以包含别名,例如 Userdata.email 而不仅仅是 email.

在你的 UsersTable class:

public function findWithUserdata(\Cake\ORM\Query $query, array $options): \Cake\ORM\Query
{
    return $query->contain('Userdata');
}

在您的 Auth 组件配置中:

'authenticate' => [
    'Form' => [
        'fields' => [
            'username' => 'Userdata.email', // << this one here
            'password' => 'password'
        ],
        'finder' => 'withUserData', // << and that one
    ]
],

这应该会按照以下行为您提供查找查询:

SELECT
    ...
FROM
    users Users
LEFT JOIN
    userdata Userdata ON Userdata.UUID = Users.UUID
WHERE
    Userdata.email = 'some@email.address'

另见