4

Ion Authが正しくインストールされ、サーバーで動作しています。同じCIインストールで動作するデフォルトのCodeIgniter2「ニュース」チュートリアルもあります。私はただ遊んでいて、認証システムを使用してアプリケーション全体を「囲む」または保護する適切な方法について興味があります。

この質問では、CIに付属の「ニュース」チュートリアルを使用してみましょう。

index()コントローラの関数内にnews.php、ユーザーがログインしているかどうかを確認する条件コードを追加しました。ログインしていない場合、ユーザーはログイン画面に移動します。

public function index() {
    $data['news'] = $this->news_model->get_news();
    $data['title'] = 'News archive';
    if ($this->ion_auth->logged_in()) {
        $this->load->view('templates/header', $data);
        $this->load->view('news/index', $data);
        $this->load->view('templates/footer');
    } else {
        redirect('auth/login', 'refresh');
    }
}

これは機能することがわかりますが、当面の欠点は、他のすべてのページビューを保護するために、コントローラー内のすべての関数も同様の条件付きロジックで変更する必要があることです。例-ログインを確認し、ページを表示します。そうでない場合は、ログインページに移動します...何度も繰り返します。

これは、それが行われることになっている方法ですか?

アプリケーションがすでに構築されて機能していて、単にすべてを保護したい場合はどうなりますか?コントローラ内のすべての単一ページビューでログインステータスをチェックするための条件付きロジックを追加することは、不必要に冗長に思えます。

コードの変更を最小限に抑えるために、アプリケーション全体(すべてのビュー)を1か所で保護できますか?もしそうなら、どのように?

4

3 に答える 3

10

__construct()コントローラ全体を保護するために、 eric.itzhakが述べたように、認証チェックを呼び出しに入れることができます。

アプリケーション全体を保護するために、CI_Controllerクラスを拡張し、そのファイルのコンストラクターにauthを配置し、最後に各コントローラーのCI_ControllerではなくMY_Controllerで拡張できます。

コード例:

/* File: application/core/MY_Controller.php */
class MY_Controller extends CI_Controller
{
    function __construct()
    {
        parent::__construct();

        if ( ! $this->ion_auth->logged_in())
        {
            redirect('auth/login');
        }
    }
}

次に、各コントローラーで(CI_ControllerではなくMY_Controllerに注意してください):

class Controller_name extends MY_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    // rest of controller methods
}

これらのコード例は、ion認証ライブラリを自動ロードしていることを前提としています(あなたもそうかもしれません)。MY_Controllerそうでない場合は、必要に応じてファイルにライブラリをロードします。

この方法には2つの利点があります。

  1. 保護する各コントローラでCI_ControllerをMY_Controllerに変更するだけです。
  2. 保護されていないコントローラー、つまり認証メソッドを含むコントローラーが必要な場合に役立つすべてを保護する必要はありません(認証コントローラーでログインが必要な場合はログインできません:P-リダイレクトループが発生します)。
于 2012-11-30T02:23:19.500 に答える
2

コンストラクターは行く方法です。他に考えるべきことがあります。IonAuthの代わりに独自のメソッドを直接呼び出すと、より柔軟になります。通常、ログインプロセスの一部は、ビューに表示される一意の値、またはセッションの追跡に使用されるIDなどを取得します。例:ページにユーザー名を表示します。

したがって、ログインしているイオン認証チェックをモデルにプッシュし、ユーザー情報や必要なものを取得するためのメソッドを追加します。メソッドごとに、機能しない場合はfalseを返します。次に、コンストラクターで、それが返されたかどうかを確認します

function __construct() {
    parent::__construct();
 // load the model
 $this->load->model( 'customer_model' );

 // if logged in, return $this->customer, available to all methods in class
 if(! $this->customer = $this->customer_model->verifyLogin() ) 
 { redirect('auth/login', 'refresh'); }
 } 

 public function index()
 {
   // pass customer to data 
  $data['customer'] = $this->customer ;

 // $customer->name will now be available in view


 } 
于 2012-12-01T01:52:58.790 に答える
1

__construct正しいロジックは、コントローラーが使用されるたびに実行されるため、メソッド内のユーザーステータスをチェックすることだと思います。ciアプリケーション全体を保護するのではなく、このコントローラーのメソッドだけを保護しますが、これで問題が解決すると思います。

これを試して :

 public function __construct()
   {

        if (!$this->ion_auth->logged_in()) 
             redirect('auth/login', 'refresh');
   }
于 2012-11-29T23:09:27.047 に答える