1

我目前正在开发一个当前具有表单身份验证的 CakePHP 应用程序。我还想打开此应用程序以供其他应用程序通过 REST 连接。

我知道 CakePHP 可以使用

Router::mapResources() 

Router::parseExtensions() 

但是,我不确定如何使用基本或摘要 HTTP 身份验证。

我在 AppController.php 中有以下内容

public $components = array(
    'Session',
    'Auth' => array(
        'authenticate' => array(
            'Form'
        ),
        'loginAction' => array(
            'admin' => false,
            'controller' => 'users',
            'action' => 'login'
        ),
        'loginRedirect' => array(
            'controller' => 'users',
            'action' => 'home'
        )
    )
);

如果对于身份验证字段,例如我在“基本”中使用 - 当登录到基于 Web 的版本时,我得到一个 HTTP 身份验证框,而不是基于 Web 的表单。

这样做的最佳方法是什么?目前我能想到的唯一方法是创建一个单独的 ApiController 并手动进行身份验证?

任何建议都会很棒。

更新:

这是我修改后的代码,它给了我正确的行为——我很确定应该有更好的方法来做到这一点。

class AppController extends Controller {

    public $components = array(
        'Session',
        'RequestHandler',
        'Auth' => array(
            'loginAction' => array(
                'admin' => false,
                'controller' => 'users',
                'action' => 'login'
            ),
            'loginRedirect' => array(
                'controller' => 'users',
                'action' => 'home'
            )
        )
    );

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

    public function beforeFilter() {
        $header = $_SERVER['HTTP_AUTHORIZATION'];
        if($header) {
            $this->Auth->authenticate = array('Basic');
        }
    }

}
4

2 回答 2

1
public function beforeFilter() {

    // Change the authentication if using REST
    if($this->params['ext'] == 'json') {
        $this->Auth->authenticate = array('Basic');
    }

}

这将检查 JSON 扩展,如果请求包含它 - 然后切换到基本身份验证。

于 2012-06-25T12:26:54.710 回答
0

检查 CakePHP 书中的 Authentication 一章。

CakePHP 支持 Form、Basic 和 Digest,您可以创建自己的身份验证对象并使用它们。

您可以加载多个身份验证对象,当其中第一个向身份验证处理程序返回 true 时,Cake 将登录用户。您只加载了 Form auth 对象,不知道为什么会得到 http auth 框。蛋糕不太可能是问题。

于 2012-06-21T09:18:25.487 回答