我目前正在开发一个目前具有表单身份验证的CakePHP应用程序。我还想打开这个应用程序,以便通过REST连接到其他应用程序。
我知道CakePHP可以使用
执行此操作Router::mapResources()
和
Router::parseExtensions()
但是,我不确定如何使用Basic或Digest 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'
)
)
);
如果对于authenticate字段,例如我在'Basic'中 - 当登录基于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');
}
}
}
答案 0 :(得分:1)
public function beforeFilter() {
// Change the authentication if using REST
if($this->params['ext'] == 'json') {
$this->Auth->authenticate = array('Basic');
}
}
如果请求包含JSON扩展,则检查JSON扩展 - 然后切换到基本身份验证。
答案 1 :(得分:0)
Check the Authentication chapter in the CakePHP book.
CakePHP支持Form,Basic和Digest,您可以创建自己的身份验证对象并使用它们。
您可以加载多个身份验证对象,当第一个用户返回true为auth处理程序时,Cake会将用户登录。您只加载了Form auth对象,不知道为何获得http auth框。 Cake不太可能成为问题。