CakePHP 3登录失败:$this->Auth->identify()始终返回false求助
解决CakePHP中
$this->Auth->identify()始终返回false的问题 我看了你的代码,发现问题出在表单字段名和Auth配置不匹配上,这是CakePHP Auth认证里很容易踩的坑!
问题根源
你的Auth组件配置里设置了:
'fields' => [ 'username' => 'email', 'password' => 'password' ]
这个配置的意思是:FormAuthenticate会从请求数据中寻找名为email的字段作为用户名,然后去数据库的email字段匹配用户。但你的登录表单(login.ctp)里的用户名输入框是:
<?= $this->Form->control('username', ['class' => 'form-control']) ?>
提交后,请求里的字段是username而不是email,Auth组件找不到对应的用户名数据,自然无法匹配用户,导致$this->Auth->identify()返回false。
快速解决方法
直接修改login.ctp里的表单控件名称,把username改成email:
<div class="users form"> <?= $this->Flash->render('auth') ?> <?= $this->Form->create() ?> <fieldset class="form-group"> <!-- 把username改成email,标签可以根据需求调整 --> <?= $this->Form->control('email', ['class' => 'form-control', 'label' => 'Email']) ?> <?= $this->Form->control('password', ['class' => 'form-control']) ?> </fieldset> <?= $this->Form->button(__('Login')); ?> <?= $this->Form->end() ?> </div>
这样提交的请求里就会有email字段,和你的Auth配置匹配,组件就能正确找到用户并验证密码了。
补充验证说明
你提到自己用password_verify验证没问题,说明数据库里的密码哈希是正确的,用户数据也存在,只是Auth组件没拿到正确的用户名字段而已。修改表单后,应该就能正常登录了。
另一种可选方案(如果不想改表单字段名)
如果你坚持要保留表单里的username字段名,可以通过自定义查询器(finder)让Auth用提交的username值去匹配数据库的email字段:
- 在
AppController的Auth配置里添加finder选项:
'authenticate' => [ 'Form' => [ 'fields' => [ 'username' => 'username', // 对应表单的username字段 'password' => 'password' ], 'finder' => 'auth' // 指定自定义查询器 ] ],
- 在
UsersTable.php里添加findAuth方法:
public function findAuth(\Cake\ORM\Query $query, array $options) { // 用提交的username值匹配数据库的email字段 return $query->where(['Users.email' => $options['username']]); }
不过这种方法比修改表单要繁琐,优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者Michał Skrzypek
相关产品推荐
相关产品推荐

