Использование компонента безопасности CakePHP с Дополнительным Авторизационным входом


У меня есть настройка REST API с CakePHP 1.3, которая использует компонент безопасности в сочетании с компонентом аутентификации для облегчения аутентификации HTTP для входа пользователя, например:

Пользовательский контроллер:

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');  
    }
}

Контроллер приложения:

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(), который заставляет вас быть аутентифицированный.

Я попытался создать новый метод authenticate(), который всегда возвращал значение true:

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;
}

Но, к сожалению, это не сработало.

Кто-нибудь знает, как с помощью компонента безопасности я могу выполнить какую-то дополнительную авторизацию?

Author: Mark Nottingham, 2013-01-24

1 answers

В итоге я добился этого, вообще не используя компонент безопасности, объявив метод optionalAuthenticate() в app_controller.php :

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)
    ...
 0
Author: petehare, 2013-01-24 03:50:57