使用CakePHP安全组件和可选的身份验证登录

时间:2013-01-23 22:28:09

标签: cakephp authentication basic-authentication

我有一个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;
}

但不幸的是,这没效果。

有没有人知道使用安全组件可以完成某种可选授权的方法?

1 个答案:

答案 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)
    ...