CakePHP 2.10控制器动作配置HTTP Basic Auth后login()始终返回true如何解决
问题原因
$this->Auth->login()无参调用的返回值本身就是布尔值,仅标识登录是否成功,不会返回用户数组,你拿到的true是登录成功的标识而非用户数据,需要获取用户信息时调用$this->Auth->user()方法即可。- Auth组件的认证校验逻辑默认在
beforeFilter阶段执行,你在控制器动作内才修改authenticate配置为Basic认证,此时默认校验已经跑完,不会自动用新配置校验当前请求的Basic凭证,需要手动触发Basic适配器的校验逻辑。 - 如果你的项目用户表不是默认的
users表,或者用户名字段不是username、密码字段不是password,需要补全Basic认证的配置项,否则会出现校验逻辑和实际表结构不匹配的问题。
修正后的代码
public function appv6() { header("Expires: Tue, 03 Jul 2001 06:00:00 GMT"); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); // 无状态认证禁用session $this->Auth->sessionKey = false; // 配置Basic认证,根据自己项目实际情况调整fields和userModel $this->Auth->authenticate = array( 'Basic' => array( 'userModel' => 'User', // 替换为你的实际用户模型名 'fields' => array( 'username' => 'username', // 替换为你的实际用户名字段名 'password' => 'password' // 替换为你的实际密码字段名 ) ) ); // 手动触发当前请求的Basic凭证校验 $user = $this->Auth->identify(); if ($user) { // 校验通过写入认证上下文 $this->Auth->login($user); } else { // 校验失败返回401要求输入凭证 $this->Auth->unauthorized($this->Auth->loginAction); } var_dump($user); // 校验通过返回用户数组,校验失败为false die; }
补充说明:如果你的项目原有密码哈希规则不是CakePHP 2默认的,需要在Basic认证配置里追加
passwordHasher配置指定和你项目一致的哈希处理类,否则会出现正确密码也校验失败的问题。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

