4

ProtectedController.php

<?php

class ProtectedController extends AppController {

    public $components = array(
        'Session',
        'Auth' => array(
            'loginRedirect' => array('controller' => 'home', 'action' => 'index'),
            'logoutRedirect' => array('controller' => 'home', 'action' => 'index')
        )
    );

    public $paginate = array(
        'limit' => 2
    );

    public function beforeFilter() {
        $this->Auth->allow('index', 'view');
    }
}

AppController

App::uses('Controller', 'Controller');


class AppController extends Controller {


}

ユーザーコントローラー

<?php

App::uses('ProtectedController', 'Controller');

class UsersController extends ProtectedController {

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('add', 'logout');
    }
}

私は持っていた

Fatal Error
Error: Call to a member function allow() on a non-object    
File: /Library/WebServer/Documents/cakephp_stats/app/Controller/ProtectedController.php 
Line: 18

Notice: If you want to customize this error message, create app/View/Errors/fatal_error.ctp

今のエラー。

誰かがこれを解決する方法を教えてください。私が見ているところから、ProtectedController にコンポーネントをロードする必要があり、AuthComponent がロードされます。

編集:

18行目はProtectedControllerのこれです:

public function beforeFilter() {
    $this->Auth->allow('index', 'view');
}

編集:

私が今できる唯一の修正は、これをカットすることです:

public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect' => array('controller' => 'home', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'home', 'action' => 'index')
    )
);

AppController に送信し、オーバーライドしてから、そこにいる全員を許可します。

class AppController extends Controller {

    public $components = array(
        'Session',
        'Auth' => array(
            'loginRedirect' => array('controller' => 'home', 'action' => 'index'),
            'logoutRedirect' => array('controller' => 'home', 'action' => 'index')
        )
    );

    public function beforeFilter() {
        $this->Auth->allow('*');
    }
}
4

1 に答える 1

1

私も似たようなことをしています。コントローラーとの主な違いは次のとおりです。

  • MyもコンポーネントをAppControllerインクルードし、その でa を実行します。Auth$this->Auth->allow()beforeFilter
  • MyProtectedControllerは login/logoutRedirects を宣言せず、その親のbeforeFilter.
  • 私の UsersController はまったく拡張しませんProtectedController。私の保護されたコントローラーには、Authコンポーネントが含まれており、親のbeforeFilter.

憶測: デフォルトの Auth コンポーネントは、許可されていない人が保護されたリソースにアクセスしようとすると、/users/login にリダイレクトします。UsersController を保護していてアクションを許可していないloginため、これが原因で発生する可能性があります。

于 2012-11-10T18:41:35.317 に答える