2

codeigniter を使用して Web アプリケーションを構築しようとしています。認証モデルとして Ion Auth をインストールしました。

デフォルトの Auth.php コントローラーは、ユーザーを認証し、セッションをセットアップします。

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Auth extends CI_Controller {



    function __construct()
    {
        parent::__construct();
        $this->load->library('ion_auth');
        $this->load->library('session');
        $this->load->library('form_validation');
        $this->load->helper('url');

        $data['title']="Login Page";
        $this->load->view("view_site_header",$data);

        // Load MongoDB library instead of native db driver if required
        $this->config->item('use_mongodb', 'ion_auth') ?
        $this->load->library('mongo_db') :

        $this->load->database();    

        $this->form_validation->set_error_delimiters($this->config->item('error_start_delimiter', 'ion_auth'), $this->config->item('error_end_delimiter', 'ion_auth'));
    }

    //redirect if needed, otherwise display the user list
    function index()
    {
        // if not logged in - go to home page
        if (!$this->ion_auth->logged_in())
        {
            //redirect them to the login page
            redirect('auth/login', 'refresh');
        }
        // if user is an admin go to this page
        elseif ($this->ion_auth->is_admin())
        {
            // if an admin, go to admin area

            //set the flash data error message if there is one
            $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message');

            //list the users
            $this->data['users'] = $this->ion_auth->users()->result();
            foreach ($this->data['users'] as $k => $user)
            {
                $this->data['users'][$k]->groups = $this->ion_auth->get_users_groups($user->id)->result();
            }

            $this->_render_page('auth/view_users', $this->data);                
        }   else
    {
        //redirect them to the default home page 
        $data['title']="IMS Home Page";
        $this->load->view("generic/view_site_header",$data);
        $this->load->view("generic/view_generic_nav");
        $this->load->view("generic/view_content_generic");
        $this->load->view("view_site_footer");
    }
}

私がやりたいことは、アプリケーション ロジック用に新しいコントローラーを作成し、認証用に auth コントローラーを残すことです。

新しいコントローラーにアクセスするときにユーザーがログインしていることを確認するために、認証コントローラーを使用するにはどうすればよいですか? さらに、セッション情報を新しいコントローラーで使用できるようにする必要があります。

私の新しいコントローラー、master_data には次のコードがあります。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Masterdata extends CI_Controller{

    function index ()
    {
            $data['title']="Master Data Home Page";
            $this->load->view("master_data/view_master_data_header",$data);
            $this->load->view("master_data/view_master_data_nav");
            $this->load->view("master_data/view_content_master_data_home");
            $this->load->view("master_data/view_master_data_footer");

            echo $this->session->userdata('username');



    }
}

echo $this->session->userdata('username');新しいコントローラーには認証コントローラーセッションの知識がないため、明らかにこれは機能しません。

いつものように助けていただければ幸いです。

敬具、

4

3 に答える 3

11

まず、ion_authライブラリを自動ロードします。ユーザーがログインしているかどうかを確認したいだけの場合は、すべてのコントローラーのコンストラクターで確認してください。

public function __construct() {  
    parent::__construct();

    if (!$this->ion_auth->logged_in()) {
       // redirect to login view
    } 
}

複数のグループがある場合は、application / core / MY_controller内に新しいコントローラーを作成できます。このコントローラーは、ユーザーがログインしているかどうかを確認します。このベースコントローラーを拡張して、新しいコントローラーを作成できます。これについては、非常に適切な説明があります。 Davidjohnによる。このリンクを確認してください。

于 2013-03-01T03:37:06.227 に答える
2

明らかに echo $this->session->userdata('username'); 新しいコントローラーは認証コントローラー セッションを認識していないため、機能しません。

ええと...セッションライブラリがロードされている場合は、そうです...それを呼び出すコントローラーは、セッション変数 $username にアクセスできます。

これを処理する方法は、application/core ディレクトリに MY_Controller のような新しいコントローラーの親クラスを作成することです。このクラスは、一般的なライブラリ/パッケージ (session やion_auth など) をロードします。ライブラリとヘルパーを自動ロードすることもできます。

ion_auth はすべてのユーザー プロファイル データをセッション var に格納するため、(後続の認証されていない) ページで必要なのは、ログインしているユーザーに関するセッション データを取得するためのセッション lib だけです。

ただし、実際には認証ステータスを確認し、正常に失敗する必要があります。

if (!$this->ion_auth->logged_in()) {
    // echo a login link
} else {
    // echo session var for username
}

そんな感じ...

于 2013-02-28T19:49:11.207 に答える
0

jcorrysアプローチが機能するはずです。別のアプローチ(アプリケーション全体の柔軟性を大幅に高める)は、モジュラーレイアウトを使用することです-https ://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc

イオン認証でうまく機能させるには少し手を加える必要がありますが、この質問の指示に従うことでうまくいきました:HMVC構造の個別のモジュールとしてイオン認証を使用する(イオンのフォークを見てください) gitハブでの認証-誰かがあなたのためにすでにそれを行っているかもしれないと思います)

このアプローチでは、次の種類の構文を使用して、アプリケーションのどこからでも(必要に応じてビューからでも)、任意のコントローラーの任意のメソッドにアクセスできます。modules::run('module/controller/method', $params);

これにより、基本的に、既存のイオン認証コントローラーを、作成した他のコントローラー(ニースおよびドライ)からアクセスできるユーザー管理コントローラーに発展させることができます。

于 2013-02-28T20:11:48.173 に答える