为AuthComponent定义自定义表

时间:2012-05-02 13:56:49

标签: cakephp authentication cakephp-2.0 cakephp-2.1

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

插件的类名都以插件名称为前缀,以避免重复的类名,因为应用程序与插件共享其大部分表。因此,有些情况下,主应用程序为UsersController,CMS插件为PluginNameUsersController(或PostsControllerPluginNamePostsController)。插件模型依赖于$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')
        )
      )
    )
  );

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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