3

コードイグナイターを使用してユーザーを正常に認証しましたが、ユーザーがコントローラーの 1 つのメソッドへのルートを入力すると、ログインせずにアクセスできます。

できればサードパーティのユーザー認証プラグインを使用せずにログインしていないユーザーへのこのアクセスを停止したいと思います。

私はこのモデルコードを持っています:

function login(){
    $data = array(
        'username' => $this->input->post('username'),
        'logged_in' => TRUE
    );
    $this->session->set_userdata($data);
} //function login()
function logged_in(){
    if($this->session->userdata('logged_in') == TRUE)
    {
        return TRUE;
    }
    return FALSE;
} //function logged in()

私はこのコントローラコードを持っています:

    function index($condition = FALSE){
    if($this->admin_model->logged_in() === TRUE)
    {
        $this->books_page(TRUE);
    }
    else
    {
        $data = $this->style_model->admin_area();
        $data['page_intro'] = 'Oops! Sorry, you must be logged in to view this page.';
        $this->load->view('admin/not_logged_in', $data);
    }
} //function index()
    function books_page(){
        $data = $this->style_model->admin_area();
        $data['category_query'] = $this->admin_books_model->get_book_categories();
        $data['page_title'] = 'Books';
        $data['query'] = $this->admin_books_model->get_books();         
        $this->load->view('admin/books/books_admin', $data);
    }    //function books_page()

ログインしていないユーザーは books メソッドにアクセスできませんが、その後アクセスできる他のメソッドにはアクセスできません。そのアクセスを停止し、ログインする必要があることを知らせるエラー ページを渡したいだけです。

前もってありがとう、トム

4

3 に答える 3

4

最善の方法は、ロジックを 2 つ (またはそれ以上) のコントローラーに分割することです。

  • 「フロントエンド」コントローラー - ユーザーがログインする必要がない場所
  • 「バックエンド」コントローラー - ユーザーはすべての操作でログインする必要があります

バックエンドコントローラーでこれを行うだけです

class Backend extends CI_Controller 
{
    public function  __construct()
    {
        parent::__construct();
        if( ! ($this->admin_model->logged_in())
        {
            // Not logged in - so force them away
            redirect ('place login page here');
       }
    }
 }

次に、backendコントローラーのすべてが保護されます。

この概念をさらに進めるには、 a の使用を検討し、MY_Controllerすべてのバックエンド コントローラーをこれから拡張します。

于 2012-09-07T12:36:41.887 に答える
1

次のように、コントローラーの上に変数を宣言します。

private $logged_in = false;

次に、コンストラクターで次のように初期化します。

$this->logged_in = $this->session->userdata('logged_in');

次に、目的のメソッド(または、コンストラクターにチェックを入れた場合は完全なコントローラー)へのアクセスを無効にできます。

if($this->logged_in)
{
   //do stuff
}
else
{
   redirect(base_url().'login');
}
于 2012-09-07T12:38:45.490 に答える
1

私があなたの質問を誤解したか、解決策が非常に簡単です。

function books_page() {
   if(!$this->admin_model->logged_in()) {
      redirect('auth/login'); ## OR $this->load->view("error_page"); exit();
   }
   ## All your code, etc.
}
于 2012-09-07T12:38:10.780 に答える