CakePHP 2.4基本HTTP身份验证弹出循环

时间:2014-02-04 15:18:06

标签: php cakephp basic-authentication restful-authentication http-basic-authentication

我目前正在尝试设置RESTful网络服务/ 基本HTTP身份验证,以及针对网络用户的表单身份验证。 (基本适用于移动客户端)。

Cake正在通过自定义passwordHasher实现使用Joomla密码哈希。在表单模式中,没有问题,所有工作都像魅力。在基本身份验证模式下,要求提供凭据的弹出窗口正在循环:无论我提供的凭据如何,弹出窗口始终会询问凭据。当我点击取消按钮时,这会将我重定向到401 Unauthorized状态(这里是正常行为)

这是我的代码:

控制器/ AppController.php

<?php
class AppController extends Controller
{
    public $components = array(
        'Session',
        'Auth' => array(
            'loginRedirect' => array(
                'controller' => 'users',
                'action' => 'getFields'
            ),
            'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => array('className' => 'Joomla')
                )
            )
        ),
        'RequestHandler'
    );

    public function beforeFilter()
    {
        // Change the authentication if using REST
        if($this->params['ext'] == 'json' || $this->params['ext'] == 'xml')
        {
            $this->Auth->authenticate = array(
                'Basic' => array(
                    'passwordHasher' => array('className' => 'Joomla')
                )
            );
            // Ensure AuthComponent doesn’t try to read user info from session.
            AuthComponent::$sessionKey = false;
        }

        $this->Auth->allow('index', 'view');

    }

}

控制器/ UsersController.php

class UsersController extends AppController
{

    function beforeFilter()
    {
        parent::beforeFilter();
        $this->Auth->allow('add', 'logout');
    }

    public function login()
    {
        if($this->request->is('post'))
        {
            $usernameForm = $this->request->data['User']['username'];
            $passwordForm = $this->request->data['User']['password'];

            $this->request->data['User']['password'] = $passwordForm . ':' . $this->User->getUserSalt($usernameForm);

            if($this->Auth->login())
            {
                return $this->redirect($this->Auth->redirect());
            }
            $this->Session->setFlash("Login et/ou mot de passe invalides !");
        }
    }
}

控制器/组件/ JoomlaPasswordHasher.php

<?php

App::uses('AbstractPasswordHasher', 'Controller/Component/Auth');

class JoomlaPasswordHasher extends AbstractPasswordHasher
{
    public function hash($password)
    {
        return $this->_joomlaEncryption($password);
    }

    public function check($password, $hashedPassword)
    {
        return ($this->_joomlaEncryption($password) === $hashedPassword);
    }

    private function _joomlaEncryption($password)
    {
        $password = explode(':', $password);
        $salt = $password[1];

        // On hash selon la methode joomla et on compare
        $hashed = md5($password[0].$salt) . ':' . $salt;
        return $hashed;
    }

}

当它在Form身份验证中工作时,我真的不明白这个问题... 谢谢你的帮助。

更新1:好的。我找到了问题来源:服务器配置。这是一个CGI / FastCGI服务器。 我在我的webroot .htaccess中试过这个,但没有任何改变。有什么想法吗?

RewriteRule ^(.*)$ index.php?url=$1 [E=REMOTE_USER:%{HTTP:Authorization},QSA,L]

0 个答案:

没有答案