我有一个CakePHP 1.3的REST API设置,它使用Security组件和Auth组件来促进用户登录的HTTP身份验证,如下所示:
UsersController:
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('view', 'add');
if ( $this->params['url']['ext'] == 'json' && !$this->Auth->user() ) {
$this->Auth->allow('edit', 'add_friend');
$this->Security->loginOptions = array(
'type'=>'basic',
'login'=>'authenticate',
'realm'=>'MyRealm'
);
$this->Security->loginUsers = array();
$this->Security->requireLogin('edit', 'add_friend');
}
}
AppController的:
function authenticate($args) {
$data[ $this->Auth->fields['username'] ] = $args['username'];
$data[ $this->Auth->fields['password'] ] = $this->Auth->password($args['password']);
if ( $this->Auth->login($data) ) {
return true;
} else {
$this->Security->blackHole($this, 'login');
return false;
}
}
这一切正常,我的问题是我有一个方法可以选择是否有身份验证。在我看来,CakePHP中的安全组件具有requireLogin()
方法,迫使您进行身份验证。
我尝试创建一个总是返回true的新authenticate()
方法:
function optionalAuthenticate($args) {
$data[ $this->Auth->fields['username'] ] = $args['username'];
$data[ $this->Auth->fields['password'] ] = $this->Auth->password($args['password']);
$this->Auth->login($data);
return true;
}
但不幸的是,这没效果。
有没有人知道使用安全组件可以完成某种可选授权的方法?
答案 0 :(得分:0)
我最后通过在app_controller.php中声明optionalAuthenticate()
方法来完全不使用安全组件来完成此任务:
function optionalAuthenticate() {
if(empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW']))
return false;
$data[ $this->Auth->fields['username'] ] = $_SERVER['PHP_AUTH_USER'];
$data[ $this->Auth->fields['password'] ] = $this->Auth->password($_SERVER['PHP_AUTH_PW']);
if($this->Auth->login($data))
return true;
else
return false;
}
然后只是从我想要尝试验证的任何方法中调用它(例如在users_controller.php中):
function view($id = null) {
$this->optionalAuthenticate();
$user = $this->Auth->user();
if($user)
...