SQLSTATE[42S22]:未找到列:“where 子句”中的 1054 列“Users.email”未知

问题描述

我在 cakePHP 4 工作。我已经为登录身份验证设置了模型(“代表”),但它使用另一个带有用户名的模型进行身份验证。我已经上传了 AppController.PHP 文件以及 EmployeesController.PHP 文件,我在其中定义了方法(操作)。

在控制器/AppController.PHP

 class AppController extends Controller
 {
   public function initialize(): void
   {
    parent::initialize();

    $this->loadComponent('RequestHandler');
    $this->loadComponent('Flash');       
    $this->loadComponent('Auth',[
        "authenticate" => [
            "Form" => [
                "fields" => [
                    "username" => "email","password" => "password"
                ],"usermodel" => "Representatives"
            ]
        ],"loginAction" => [
            "controller" => "Employees","action" => "login"
        ],"loginRedirect" => [
            "controller" => "Employees","action" => "home"
        ],"logoutRedirect" => [
            "controller" => "Employees","action" => "login"
        ]
    ]);
}

在员工控制器中:

 class EmployeesController extends AppController
  {
     public function initialize(): void
     {
      parent::initialize();
      $this->loadModel("Employees");
      $this->loadModel("Representatives");
      $this->loadComponent('Flash');
    }

public function login()
  {
    if ($this->request->is('post')) {
        $user = $this->Auth->identify();
        // echo "<pre>"; print_r($user); die; 
        if ($user) {
            $this->Auth->setUser($user);
            echo "<pre>"; print_r($user); exit(); 
            return $this->redirect($this->Auth->redirectUrl());
        } else {
            $this->Flash->error(__('Username or password is incorrect'));
        }
    }
    $this->viewbuilder()->setLayout('home');
    $this->set("title","Login");
  }

在模型/实体/Representative.PHP

<?PHP

namespace App\Model\Entity;

use Authentication\PasswordHasher\DefaultPasswordHasher;
use Cake\ORM\Entity;

class Representative extends Entity
 {
  protected $_accessible = [
    
    'id' => false,'name' => true,'role' => true,'email' => true,'password' => true,'phone' => true,'slug' => false
];

protected function _setPassword(string $password) : ?string
{
    if (strlen($password) > 0) {
        return (new DefaultPasswordHasher())->hash($password);
    }
}
}

在模型/表/RepresentativesTable.PHP

 <?PHP
 namespace App\Model\Table;

 use Cake\ORM\Table;
 use Cake\Utility\Text;
 use Cake\Event\EventInterface;

 class RepresentativesTable extends Table
 {
  public function initialize(array $config) :void
   {
  

    $this->setTable("newusers");
    


 }


  public function beforeSave(EventInterface $event,$entity,$options)
  {
    if ($entity->isNew()  && !$entity->slug) {
        $sluggedTitle = Text ::slug($entity->name);
        $entity->slug = substr($sluggedTitle,191);
    }
  }
 }

解决方法

虽然视频翻译很糟糕。我能够按照视频中的示例进行操作,重要的部分是添加“解析器”以允许 cakephp 找到正确的表。

,'resolver' => [
                'className' => 'Authentication.Orm','userModel' => 'YourUserTable'
            ],

这确实造成了 $this->Identiy->get 失败的另一个问题,我希望会添加一个解析器,使其也能按预期工作。

谢谢!!

,

默认情况下,cakephp 使用用户模型进行身份验证

您可以在此 video

中找到使用其他路由的身份验证示例

示例中定义如下:

public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
    {
        $authenticationService = new AuthenticationService([
            'unauthenticatedRedirect' => '/cinema4/usuarios/login','queryParam' => 'redirect',]);
    
        // Load identifiers,ensure we check email and password fields
        $authenticationService->loadIdentifier('Authentication.Password',[
            'fields' => [
                'username' => 'login','password' => 'senha',],'userModel' => 'Usuarios'
            ],]);
    
        // Load the authenticators,you want session first
        $authenticationService->loadAuthenticator('Authentication.Session');
        // Configure form data check to pick email and password
        $authenticationService->loadAuthenticator('Authentication.Form','loginUrl' => '/cinema4/usuarios/login',]);
    
        return $authenticationService;
    }    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...