1

ユーザーがURL(コントローラー/メソッド)の組み合わせにアクセスする権限を持っているかどうかを確認したいと思います。呼び出されたコントローラーで呼び出されたメソッドとメソッドが属する前にチェックする必要があります。

私が理解している限り、フックは上記のロジック用である必要がありますが、それを使用すると、以下に示すpre_controllerものと衝突すると思います。post_controller_constructor代わりに使用post_controllerすると機能しますが、今回はロジックが損なわれます。

どうすればこの問題を解決できますか?

ありがとう

CONFIG / HOOKS

//Used to authenticate user session to decide whether to authenticate site or not
$hook['post_controller_constructor'] =
array(
'class'    => 'site_authentication',
'function' => 'authenticate',
'filename' => 'site_authentication.php',
'filepath' => 'hooks',
'params'   => null
);


//Used to authenticate permitted controllers
$hook['pre_controller'] =
array(
'class'    => 'permitted_controllers',
'function' => 'authenticate',
'filename' => 'permitted_controllers.php',
'filepath' => 'hooks',
'params'   => null
);

アプリケーション/フック

//This works fine
class site_authentication
{
    private $CI;

    public function __construct()
    {
        $this->CI =& get_instance();
    }

    public function authenticate()
    {
        if (! $this->CI->session->userdata('site'))
        {
            redirect('to error page');
        }

        $user_session = $this->CI->session->userdata('site');
        //Some more stuff here
    }
}



//This doesn't work with pre_controller
class permitted_controllers
{
    private $CI;

    public function __construct()
    {
        $this->CI =& get_instance();
    }

    public function authenticate()
    {
        $user_session = $this->CI->session->userdata('site');

        //Url is set here, ignore syntax error below
        $url = $this->CI->uri->segment(1) . 2 . 3;

        if (! in_array($url, $user_session['controllers']))
        {
            redirect('to error page');
        }
    }
}

2つを組み合わせると、下では正常に機能しますpost_controller_constructorが、別々には機能しませんか?

$hook['post_controller_constructor'] [] =
array(
'class'    => 'site_authentication',
'function' => 'authenticate',
'filename' => 'site_authentication.php',
'filepath' => 'hooks',
'params'   => null
);

$hook['post_controller_constructor'] [] =
array(
'class'    => 'permitted_controllers',
'function' => 'authenticate',
'filename' => 'permitted_controllers.php',
'filepath' => 'hooks',
'params'   => null
);
4

2 に答える 2

2

pre_controllerフックはスーパーオブジェクトが構築される前に実行されるため、CIの通常の構文(など$this->db->query())にフックするための実行可能なオプションではありません。

ベースコントローラー(別名MY_Controllerまたはその他の名前)を作成し、そのコンストラクターにアクセス許可チェックを追加することをお勧めします。次に、権限チェックを実行する必要がある各コントローラーは、CI_ControllerではなくMY_Controllerを拡張します。これは、ベースコントローラーに関するPhilSturgeonの古典的な記事です。

フックは、ページが読み込まれるたびに呼び出されます。どこかで権限を確認する必要がない場合は、そのロジックをフックに追加するか、別の場所にロジックを追加して無効にする必要があります。あまり拡張可能ではありません。ベースコントローラを使用すると、権限チェックを追加するのは、別のクラスを拡張するのと同じくらい簡単です。

于 2013-03-13T06:55:16.123 に答える
0

pre_controllerフックは、スーパーオブジェクトが完全に構築される前に実行されます。詳細はこちらをご覧ください

于 2013-03-12T18:04:55.710 に答える