CakePHP 2.0基本身份验证始终提供302重定向而不是401未授权

时间:2012-02-14 04:41:33

标签: php cakephp basic-authentication

我在一个简单的CakePHP 2.0应用程序中设置了基本身份验证。我首先设置应用程序以使用常规表单身份验证,然后我将以下行添加到我的AppController.php的beforeFilter()以启用基本的http身份验证:

$this->Auth->authenticate = array('Basic');

这是完整的AppController:

<?php
class AppController extends Controller {

    public $components = array(
            "Session",
            "Auth" => array(
                'loginRedirect' => array('controller'=>'users','action'=>'index'),
                'logoutRedirect' => array('controller'=>'users','action'=>'index'),
                'authError' => "You are not authorized to view this page.",
                'authorize' => array('Controller'),
        )
    );

    public function isAuthorized($user) {
        return true;
    }

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('index','view');
        $this->set('logged_in', $this->Auth->loggedIn());
        $this->set('current_user',$this->Auth->user());
        $this->Auth->authenticate = array('Basic');
    }
}
?>

理想情况下,我想要一个特定的控制器(一个控制器,它将公开一个用于移动设备的API)从整个应用程序中仅使用基本HTTP身份验证,其余控制器的行为就像一个普通的网络应用

目前,如果我将不正确的凭据传递给控制器​​,我会得到一个HTTP 302响应,当我真的想要传回HTTP 401时。我怎么能这样做?

*为拼写错误编辑

3 个答案:

答案 0 :(得分:1)

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('index','view');
    $this->set('logged_in', $this->Auth->loggedIn());
    $this->set('current_user',$this->Auth->user());
    if($this->name == 'Specific') {
            // for the specific controller
            $this->Auth->authenticate = array('Basic');
    } else {
            // everything else
    }
}

结账KVZ的休息插件可能会引起人们的兴趣 https://github.com/kvz/cakephp-rest-plugin

答案 1 :(得分:1)

我还没有尝试过2.0,但通常Auth所做的是使用setFlash设置错误信息,然后将你重定向到某个地方以显示该信息。这可能是你获得302重定向的原因。

如何手动设置标题然后退出?

e.g。

public function login() {
    if ($this->Auth->login()) {
        return $this->redirect($this->Auth->redirect());
    } else {
        header("HTTP/1.0 401 Unauthorized");
        exit;
    }
}

答案 2 :(得分:1)

cakePHP 2.x 中,您可以create a custom status code例如

if ($this->Auth->login()) {
  return $this->redirect($this->Auth->redirect());
} else {
  throw new MissingWidgetHelperException('You are not authorized to view this page.', 401);
}