我目前正在尝试设置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]