1

我创建了一个简单的 CMS 来管理几个基于 CakePHP 的小型网站。在成功将插件从 1.3 迁移到 2.0 后,我在将 Cake 更新到最新版本 2.1.2 后遇到了 AuthComponent 问题。

插件的类名都以插件名称为前缀以避免重复的类名,因为应用程序与插件共享其大部分表。所以在某些情况下,我有一个UsersController用于主应用程序和一个PluginNameUsersController用于我的 CMS 插件(或 aPostsController和 a PluginNamePostsController)。插件模型依赖于$useTable找到正确的数据库表(所以PluginNamePostsController仍然使用posts)。

自从升级到 Cake 的 2.1.* 分支以来AuthComponent,它已经停止工作,因为它期望一个不存在的pluginname_users表而不是引用users.

是否可以为 定义自定义表,AuthComponent或者是否有任何其他方法可以使其正常工作?另外,这种行为是预期的吗?

组件配置PluginNameAppController如下:

  public $components = array(
    'Session', 'RequestHandler',
    'Auth'=> array(
      'loginAction' => array(
        'controller' => 'pluginname_users',
        'action' => 'login',
        'plugin' => 'pluginname'
      ),
      'loginRedirect' => array(
        'controller' => 'pluginname_posts',
        'action' => 'index',
        'plugin' => 'pluginname'
      ),
      'authenticate' => array(
        'Form' => array(
          'userModel' => 'PluginNameUser',
          'fields' => array('username', 'password')
        )
      )
    )
  );
4

1 回答 1

1

AuthComponent 实际上不知道表等。通过使用自定义模型,您可以$table在其上定义以在不同的表上工作。因此,第一件事是设置插件的模型以使用正确的表:

class PluginNameUser extends PluginAppModel {
  public $table = 'users';
}

然后,通过使用点语法告诉您的身份验证方法使用插件的模型。

'authenticate' => array(
   'Form' => array(
     'userModel' => 'PluginName.PluginNameUser',
     'fields' => array('username', 'password')
   )
 )

现在,当 FormAuthenticate 尝试进行身份验证时,它将尝试使用该模型查找用户,它现在知道该模型在 PluginName 中。它加载您设置为使用该users表的模型,并在那里查找用户。

于 2012-05-02T14:24:56.740 回答