2

次のように、CakePHP 1.3 で REST API をセットアップしました。これは、Security コンポーネントと Auth コンポーネントを組み合わせて使用​​し、ユーザー ログインの 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');  
    }
}

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 の Security コンポーネントには、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;
}

しかし、残念ながらそれはうまくいきませんでした。

セキュリティ コンポーネントを使用して、ある種のオプションの承認を達成できる方法を知っている人はいますか?

4

1 に答える 1

0

optionalAuthenticate()app_controller.php でメソッドを宣言することにより、Security コンポーネントをまったく使用せずにこれを達成することになりました。

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)
    ...
于 2013-01-24T03:50:57.707 に答える