【问题标题】:CakeDC Users plugin: Use email field as a usernameCakeDC 用户插件:使用电子邮件字段作为用户名
【发布时间】:2015-11-01 12:50:40
【问题描述】:

是否可以将 CakeDC 的用户插件配置为使用电子邮件字段作为用户名?

默认情况下,用户插件中同时包含用户名和电子邮件字段,而且都很好用!但是我想使用电子邮件作为用户名进行身份验证,这样可以简化用户注册。

我尝试通过在 AppController 中加载 Auth 组件来覆盖 UsersAuthComponent,但登录停止工作并显示“用户名或密码错误” .

public function initialize()
{
    parent::initialize();
    $this->loadComponent('Flash');
    $this->loadComponent('Auth', [
        'loginAction' => [
            'plugin' => 'CakeDC/Users',
            'controller' => 'Users',
            'action' => 'login',
        ],
        'authenticate' => [
            'all' => [
                'scope' => ['active' => 1]
            ],
            'CakeDC/Users.RememberMe',
            'Form' => [
                'fields' => ['username' => 'email', 'password' => 'password']
            ]
        ],
        'authorize' => [
            'CakeDC/Users.Superuser',
            'CakeDC/Users.SimpleRbac',
        ],
        'storage' => 'Session'
    ]);

    $this->loadComponent('CakeDC/Users.UsersAuth');
}

按照文档,我还关闭了 bootstrap.php 中的 UsersAuthComponent

Configure::write('Users.auth', false);

有什么诀窍吗?我相信这是可能的,或者可能是一个错误?

我正在使用 CakePHP 3.1 和 CakeDC 用户插件 3.1

【问题讨论】:

    标签: email plugins cakedc cakephp-3.1


    【解决方案1】:

    您可能缺少的部分是覆盖 login.ctp 模板以更改表单并让用户输入他的电子邮件

    为此,您需要在 /src/Template/Plugin/CakeDC/Users/Users/login.ctp 下创建一个文件,其中包含您希望用于登录页面的内容(通常您需要覆盖此页面在您执行的每个应用程序中)并确保您在该视图中创建输入“电子邮件”。代码可能是这样的

    <div class="users form">
        <?= $this->Flash->render('auth') ?>
        <?= $this->Form->create() ?>
        <fieldset>
            <legend><?= __d('Users', 'Please enter your username and password') ?></legend>
            <?= $this->Form->input('email', ['required' => true]) ?>
            <?= $this->Form->input('password', ['required' => true]) ?>
        </fieldset>
        <?= $this->Form->button(__d('Users', 'Login')); ?>
        <?= $this->Form->end() ?>
    </div>
    

    如果您想保留社交登录链接、记住我等,您可以使用 CakeDC/Users login.ctp 模板作为示例。我在这里使用登录表单的简化版本作为示例。

    我们将很快改进插件以简化此覆盖。

    【讨论】:

    【解决方案2】:

    我认为这就是 MultiColumnAuthenticate 的用途,只是在 GitHub 上查看插件。试试这样的:

    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('Flash');
        $this->loadComponent('Auth', [
            'loginAction' => [
                'plugin' => 'CakeDC/Users',
                'controller' => 'Users',
                'action' => 'login',
            ],
            'authenticate' => [
                'all' => [
                    'scope' => ['active' => 1]
                ],
                'CakeDC/Users.RememberMe',
                'FOC/Authenticate.MultiColumn' => [
                    'fields' => [
                        'username' => 'username',
                        'password' => 'password'
                    ],
                    'columns' => ['username', 'email'],
                    'userModel' => 'Users',
                ]
            ],
            'authorize' => [
                'CakeDC/Users.Superuser',
                'CakeDC/Users.SimpleRbac',
            ],
            'storage' => 'Session'
        ]);
    
        $this->loadComponent('CakeDC/Users.UsersAuth');
    }
    

    这将在登录时检查电子邮件和用户名。

    【讨论】:

    • 嗨艾萨克!感谢您的回答...不幸的是,直到现在我才有时间对其进行测试。我一直在寻找“FOC/Authenticate.MultiColumn”插件,但该网站说不再维护。但它帮助我导航到那里以获取我需要的信息 ;-) FOC 在 github 上说:“MultiColumnAuthenticate,现在可以使用 CakePHP 3 中的自定义查找器实现这一点”所以我意识到它必须用蛋糕3.1以干净的方式完成! 它奏效了。
    • 错误是,我一直从我的模板发送错误的输入名称:$this-&gt;Form-&gt;input('username'); 而不是$this-&gt;Form-&gt;input('email'); 所以即使它配置得很好,它也没有配置电子邮件字段!我只是假设 CakeDC 插件会为我呈现该字段,但事实并非如此,必须自定义 .ctp 模板。
    • 我确认,上面主要帖子中提到的覆盖 Auth:...'Form' =&gt; [ 'fields' =&gt; ['username' =&gt; 'email', 'password' =&gt; 'password'] ]... 在您的自定义配置 users.php 仅适用于 CakePhp3.1 + CakeDC 用户插入。此处也有详细记录:link(查找“字段”)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2012-02-06
    • 2015-04-27
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多