0

我有一个非常奇怪的问题,我根本无法弄清楚。我设置了一个 cakephp 项目,我正在使用用户控制器来处理身份验证,一切都运行良好,100%。但是,我决定删除用户控制器、模型和视图,并将其替换为我的成员之一,因为成员将是我的主要用户,其中有一两个需要登录的管理员。

我现在的 Members 模型、控制器和视图中的内容与我在 Users 中的内容相同,但默认情况下,CakePHP 想要使用 Users 模型和 users 表。我做了很多调试,最终让 CakePHP 使用成员而不是用户,但现在我根本无法登录,因为我不断收到您的用户名和密码不正确,请重试错误消息。

这是我通过代码获得的内容,我希望有人能指出我正确的方向。

应用控制器.php

function beforeFilter()
{
    $this->Auth->userModel = 'Member';
    $this->Auth->authorize = array('Member');
    $this->Auth->allow(array('view', 'index', 'add', 'edit', 'delete'));
}

public $helpers = array ('Html', 'Form', 'Session', 'Time'); 

public $components = array(
    'DebugKit.Toolbar',
    'Session',
    'Cookie',
    'Auth' => array(
        'loginAction' => array(
            'controller' => 'members',
            'action' => 'login'
        ),
        'authError' => 'Your username and password is incorrect, please try again.',
        'authenticate' => array(
            'Form' => array(
                'fields' => array('username' => 'username', 'password' => 'password',
                'scope' => array('Member.deleted' => '0')),
                'passwordHasher' => 'Blowfish'
            )
        )
    )
);

需要注意的重要一点beforeFilter()是,我尝试了 Member 的复数和单数,并且我还添加了该$this-Auth->allow()函数,以便我可以在 Members 表中编辑我的用户密码,以确保我的密码被正确散列。

另请注意,在我所看到的任何地方,我都看到在使用时loginAction它应该是这样的:

'loginAction' => array(
    'controller' => 'Members',
    'action' => 'login',
    'plugin' => 'members'
),

使用上面的问题是我的 URL 结构最终看起来像,/members/Members/login因此我在我的 AppController 中省略了插件键值对,我猜这可能是错误所在。

会员.php

public function isAuthorized($user) {
    if (!empty($this->request->params['admin'])) {
            return $user['role'] === 'admin';
    }
    return !empty($user);
}

public function beforeSave($options = array()) {
    if (isset($this->data['Member']['password'])) {
        $this->data['Member']['password'] = AuthComponent::password($this->data['Member']['password']);
    }
    return true;
}

成员控制器.php

public function login() {
if ($this->request->is('post')) {
    if ($this->Auth->login()){
        return $this->redirect($this->Auth->redirectUrl());
        } else {
            $this->Session->setFlash(__('Your username and password is incorrect, please try again.'));
        } // end if cannot log in
    } // end if no form submitted
} // end login

public function logout() {
    $this->Session->destroy();
    $this->redirect($this->Auth->logout());
}

/会员/login.ctp

<div id="page-content" class="span9">
    <div class="users form">
        <?php echo $this->Form->create('Member', array('inputDefaults' => array('label' => false), 'class' => 'form form-horizontal')); ?>
            <fieldset>
                <h2><?php echo __('Member Login'); ?></h2>
                <div class="control-group">
                    <?php echo $this->Form->label('username', 'username', array('class' => 'control-label'));?>
                    <div class="controls">
                        <?php echo $this->Form->input('username', array('class' => 'span12')); ?>
                    </div><!-- .controls -->
                </div><!-- .control-group -->
                <div class="control-group">
                    <?php echo $this->Form->label('password', 'password', array('class' => 'control-label'));?>
                    <div class="controls">
                        <?php echo $this->Form->input('password', array('class' => 'span12')); ?>
                    </div><!-- .controls -->
                </div><!-- .control-group -->
                <?php echo $this->Form->input('auto_login', array('type' => 'checkbox', 'label' => 'Remember me?')); ?>
            </fieldset>
        <?php echo $this->Form->submit('Submit', array('class' => 'btn btn-large btn-primary')); ?>
        <?php echo $this->Form->end(); ?>
    </div>  
</div>

正如我所说,任何帮助都会令人惊叹,因为我已经经历了我所知道的一切,试图让它发挥作用......

4

3 回答 3

1

对于我要登录的每种类型的组(例如管理员、用户或任何其他类型),您必须在控制器和模型中编写以下内容:

假设您有两种类型的用户可以访问不同的平台,例如管理员和用户

在控制器/AppController.php 中

public $components = array(
        'Acl',
        'Auth' => array(
            'authorize' => array(
                'Actions' => array('actionPath' => 'controllers/')
            )
        ),
        'Session');

在模型/Administrator.php

 public function beforeSave() {
        if (isset($this->data['Administrator']['password'])):
            $this->data['Administrator']['password'] = AuthComponent::password($this->data['Administrator']['password']);
            return true;
        endif;
    }

 public $actsAs = array('Acl' => array('type' => 'requester'));

 public function parentNode() {
    if (!$this->id && empty($this->data)) {
        return null;
    }
    if (isset($this->data['Administrator']['group_id'])) {
        $groupId = $this->data['Administrator']['group_id'];
    } else {
        $groupId = $this->field('group_id');
    }
    if (!$groupId) {
        return null;
    } else {
        return array('Group' => array('id' => $groupId));
    }
}

在 Controller/AdministratorsController.php beforeFilter()

$this->Auth->authorize = array('Actions' => array('actionPath' => 'controllers/', 'userModel' => 'Administrator'));
$this->Auth->authenticate = array('Form' => array('userModel' => 'Administrator'));

$this->Auth->loginAction = array(/*YOUR PATH HERE*/);
$this->Auth->logoutRedirect = array(/*YOUR PATH HERE*/);
$this->Auth->loginRedirect = array(/*YOUR PATH HERE*/);

如果您的所有小组都有这个,它应该会很好用!
我有三种类型的组:管理员、商店和用户,这对我有用!

于 2013-08-20T12:30:53.810 回答
1

尝试将它放在 AppController.php 文件的 beforeFilter 中

$this->Auth->loginAction = array('controller' => 'members', 'action' => 'login');

这应该将您的应用程序引导到正确的 url 以登录。

于 2013-08-19T23:22:22.250 回答
1

读过这个吗?如果现在不做。

那里的例子很清楚:

$this->Auth->authenticate = array(
    'Basic' => array('userModel' => 'Member'),
    'Form' => array('userModel' => 'Member')
);

您必须指定表单身份验证适配器应使用的模型。

对于重定向问题,定义

$this->Auth->redirectUrl = array(/* Whatever you need here */);
于 2013-08-19T22:40:54.470 回答