【问题标题】:How to get Authentication working again in CakePHP 2.0?如何在 CakePHP 2.0 中让身份验证再次工作?
【发布时间】:2011-10-28 21:35:48
【问题描述】:

在将功能齐全的 Cake 1.3 应用程序迁移到最近发布的 2.0 版本后,身份验证已停止工作。

我已根据更新的 2.0 手册更改了 AuthComponent 的调用和 login 操作的结构,但无济于事。奇怪的是用户实际上是由$this->Auth->login() 验证的,因为它到达登录功能的一部分,用户被重定向到$this->Auth->redirect() 设置的url。然而,在重定向之后,$this->Auth->user() 返回空(以及AuthComponent::user())并且用户没有通过 Auth 组件登录。

Cake 在此过程中不会抛出任何错误,'auth' 的 flash 消息保持为空。

用户存储在一个简单的数据库表中,其中包含 id、username、email、password 和 timestamp 列。密码经过哈希处理,我使用新的 Cake 2.0 方法添加了一些用户。

这是AppController.php的代码:

<?php
  class AppController extends Controller {
    public $helpers = array('Session', 'Html', 'Time', 'Form', 'Text');
    public $components = array('Session', 'RequestHandler', 'Auth');    

    public function beforeFilter() {
        $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
        $this->Auth->loginRedirect = array('controller' => 'maps', 'action' => 'index');
        $this->Auth->logoutRedirect = array('controller' => 'maps', 'action' => 'index');
    }
  }
?>

用户控制器.php:

<?php
  class UsersController extends AppController {
    public $name = 'Users';

    function beforeFilter() {
      parent::beforeFilter();
    }

    function login() {
      if ($this->request->is('post')) {
        if ($this->Auth->login()) {
          return $this->redirect($this->Auth->redirect());
        }
      }
    }

    function logout() {
      $this->redirect($this->Auth->logout());
    }
  }
?>

User.php 模型。解决此问题后,我暂时禁用了表单验证:

<?php
  class User extends AppModel {
    public $name = 'User';
  }
?>

登录视图:

  <?php
    echo $this->Form->create('User');
    echo $this->Form->input('username', array('label' => 'Username', 'before' => '<p class="input" id="username">', 'after' => '</p>', 'between' => '<br />', 'div' => false));
    echo $this->Form->input('password', array('label' => 'Password', 'before' => '<p class="input" id="password">', 'after' => '</p>', 'between' => '<br />', 'div' => false));
    echo $this->Form->end('Login');
  ?>

我还尝试在AppController$components 变量中设置一些Auth 功能,但效果不佳:

  public $components = array(
    'Auth'=> array(
      'loginAction' => array(
        'controller' => 'users',
        'action' => 'login',
      ),
      'loginRedirect' => array(
        'controller' => 'maps',
        'action' => 'index',
      ),
      'authenticate' => array(
        'Form' => array(
          'fields' => array('username', 'password')
        )
      )
    )
  );

是什么导致了这里的问题?路由可能?我已经注释掉了所有路线,除了:

require CAKE . 'Config' . DS . 'routes.php';

更新: 在 UsersController 的登录方法中添加一些调试语句后,我现在知道 $this-&gt;Auth-&gt;user() 在调用 $this-&gt;Auth-&gt;login() 后实际上填充了正确的用户。然而,在重定向到另一个控制器后,登录会话完全丢失。所以我还是不知道这里出了什么问题。

更新 2 我已经重新启动了迁移过程,方法是使用我的工作 1.3 应用程序并像上次一样在其上运行迁移控制台脚本。

这一次我注意到脚本由于两个与自定义组件相关的错误而停止。组件类现在应该扩展 Component,而不是 1.3 的默认值:Object。

修复这些组件错误后,我再次运行了迁移脚本(在第一次迁移尝试期间我忽略了这样做)并实现了新的 AuthCompenent 调用。到目前为止,一切似乎都正常工作。不知道现在有什么不同以及第一次出了什么问题,因为 Cake 没有输出任何错误消息。

更新 3 越来越奇怪了。我以为我解决了它,但是在将我的代码转移到另一台开发机器之后,Auth 突然停止工作。它正在我的主要设置上工作,但是在另一个测试上它在相同的情况下再次失败。我已经清除了缓存以确保它仍然无法正常工作。 Cake 不会产生任何错误输出。

更新 4 这似乎是我机器上的会话问题。我刚刚将 Session 设置为存储在 cookie 中,突然 Auth 又开始工作了。不知道为什么默认 Session 不起作用,在这种情况下我不知道从哪里开始调试。

似乎只有 cookie 会话有效,定义数据库会话与常规会话的结果相同;身份验证停止工作。

【问题讨论】:

    标签: cakephp authentication cakephp-2.0


    【解决方案1】:

    在 /Config/core.php 中启用 use_trans_sid 试试:

    Configure::write('Session', array(
        //'defaults' => 'php'
        'defaults' => 'cake',
        'cookie' => 'CAKEPHP2',
        'ini' => array('session.use_trans_sid' => true)
    ));
    

    【讨论】:

    • use_trans_sid不被认为是不安全的吗?
    • 其实,我不知道 - 我正在尝试测试 cakeDC 用户插件(2.0 分支),但没有成功。所以我试图弄清楚什么会起作用。
    • 现在,我在没有 'session.use_trans_sid' => true 的情况下让它工作了......但我不知道为什么,因为我已经改变了很多并把它改回来等等......
    • 感谢您的跟进。不幸的是,如果它不安全,我将不会使用它。 Auth 组件仍然让我很苦恼,但是当它真正起作用时,它相对来说是无痛的。
    【解决方案2】:

    您是否也尝试配置身份验证处理程序?

    public $components = array(
        'Auth'=> array(
            'authenticate' => array('Form')
        )
    );
    

    【讨论】:

    • 是的,我在公共 $components 变量中进行了一项测试。
    • 你的会话配置怎么样? book.cakephp.org/2.0/en/development/sessions.html
    • Session 已经在 Core.php 中配置好了,但是直接写一个新的配置键就不行了,很遗憾。
    • 我认为你是在正确的轨道上。我刚刚将我的 Session 设置为存储在 cookie 中,而 Auth 突然开始工作了。我想知道我是否可以调试默认的 Session 设置,因为我的一台机器显然出了问题。
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2012-01-16
    • 2015-08-22
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多