2016-06-22 7 views
0

私は現在、Codeigniterというフレームワークでアプリケーションを開発中です。私のプロジェクトは、異なる操作を持つ異なるレベルのユーザーで構成されています。不正なアクセスからユーザを制限する

私はDefault_modelを作成しました。これはデータベースとのすべてのやりとりを処理します。すべてのコントローラーがこの単一のモデルとやりとりします。

各ユーザーは、登録時にユーザーによって指定された指定を持っています(管理者のみがプロファイル承認を取得した後でプロファイルにアクセスします)。

マイimplementaion

user1をしてみましょうを指定Level1に登録されていると、彼は名前を使用して操作にアクセスすることができますoperation1

私は、コントローラ内の関数とuser1アクセスが書かれている現在やっていますwww.example.com/page/operation1による操作。ここでは、データベースから取得した関数にアクセスする権限がある場合(コントローラのコンストラクタで必要なデータには指定が含まれていますが、セッションではuseridが設定されています)、ユーザーの指定(==="level1")を確認します。 (level1でない場合)404が表示されます。

現在、モデルの指定チェックは行っていません。モデル内の関数が呼び出された場合は、データを返します。彼がモデルで許可されているかどうか再度確認する必要がありますか?私のシナリオへのより一般的なアプローチや実装が容易なアプローチはありますか?

更新

コントローラー:page.php

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

class Page extends CI_Controller { 

    public $id; 

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

     //load libraries and model(Default_model) here 

     $this->id = $this->getData(); //loading data from DB, returns FALSE if session empty 

     if ($this->id) { 
      //has data 
     } else { 
      $data = array(
       'error' => 'Login to continue. <a href="' . base_url() . '">CLICK HERE</a>' 
      ); 
      $this->load->view('error_view', $data); 
     } 
    } 
    public function operation1() 
    { 
      if($this->id->designation === 1) 
      { 
       //call model method because he is LEVEL 1 user 
      } 
    } 
} 
+0

関連するコードを表示 –

答えて

3

をモーダルときに簡単な方法は、一度だけ

を書くためにあなたがフックを利用することができ、他に実行する必要があります

ステップ1:フックの 使用post_controller_constructor:

はconfig.phpの中にフック

$config['enable_hooks'] = TRUE;

ステップ2をイネーブルこのようなS:Location /config/hooks.php

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

The code above,Auth_module.php is reside in the folder application/hooks/Auth_module.php and the function name is index that function is called after the constructor of called class

<?php 


class Auth_module { 

    var $CI; 
    var $user_id; 
    var $role_id; 
    var $collegeId; 

    public function __construct() { 
     $this->CI = & get_instance(); 
     $this->CI->load->library('session'); //if it's not autoloaded in your CI setup 
     $admin_user_data = $this->CI->session->userdata('admin_user_data'); 
     $this->CI->load->model('admin_model'); 
     $this->CI->load->library('user_agent'); 
    } 

    public function index() { 
      if (!empty($this->user_id)) { 

      $class= $this->CI->router->fetch_class();   

      $method= $this->CI->router->fetch_method(); 
      $role_name = $this->getRoleName($this->role_id); 




      if ($role_name) { 
       $Adminpermission = $this->CI->admin_model->getPermissions($class,$role_name); 
       $Adminpermission_lower = array(); 
       foreach($Adminpermission as $mm_name) 
        $Adminpermission_lower[] = strtolower($mm_name); 


       if(!empty($Adminpermission)){ 
        if(in_array($method, $Adminpermission) || in_array($method, $Adminpermission_lower)){ 
          $log_data['access'] = 'success'; 
          //* all is ok here*/ 
       }else if($class !='dashboard' and $class !='admin'){ 

         $message='You don\'t have permissions to access this module. Please contact your administrator.'; 
         $this->redirectMethod($message,$class); 
         $log_data['access'] = 'failed'; 
        } 

       }else if($class !='dashboard' and $class !='admin'){ 
        $message='You don\'t have sufficient permissions.please contact your administrator.'; 
        $this->redirectMethod($message); 
        $log_data['access'] = 'not defined in db'; 
       } 

      } 
      else if($class !='dashboard' and $class !='admin') { 
       $message='Request role is not defined. Please contact to your administrator or mail : [email protected] .'; 
       $this->redirectMethod($message); 
       $log_data['access'] = 'role name not defined'; 
       } 

     } 




    } 

    public function redirectMethod($message,$class=''){ 
       $message = "<div class='alert alert-danger' role='alert'>".$message."</div>" ; 
       $this->CI->session->set_flashdata('flashMessage', $message); 
       if($class==null){ 
       redirect('dashboard'); 
       }else{ 
        redirect($class); 
       } 
    } 

    public function getRoleName($id) { 
     $master_db = $this->CI->load->database('master', TRUE); 
     $result = $master_db->query("select role_name from role where id='$id'"); 

     $num_rows = $result->num_rows(); 
     if ($num_rows == 1) { 
      return $result->row()->role_name; 
     } else { 
      return false; 
     } 
    } 

} 

ようAuth_module.phpコードは、あなたの要件ごとに認証ファイルを変更します。

1

これは理論的に純粋であると私はあなたの問題にアプローチする方法を説明します。

  • デフォルトのコントローラを作成し、他のすべてのコントローラがこの1
  • オプション各コントローラの上部に同じアクセスレベルを定義し、このベースコントローラでpublic $accessLevel = 0;を設定して拡張してみましょう:このレベルを上書きユーザーのACCESSLEVELが必要ACCESSLEVEL
同等以上であれば、これはあなたのビューファイルをレンダリングする前
  • を必要とされている場合は、コントローラのメソッドでは、チェック

    あなたの質問にお答えします。あなたのモデルでこれを二重にチェックする必要はありません。これはあなたのコントローラーで行われるはずのロジックです。ただし、データベースにすべてのページを格納してそこにaccessLevelを与えることができます。ユーザーは、クエリのページにアクセスできるかどうかを確認できます。

  • +0

    データベースのクエリを処理して結果を返すという制限がないため、誰かがモデルの関数を直接呼び出す可能性が疑問でした –

    +0

    コントローラの更新コードを確認してください –

    0

    ユーザーがレベル1にあることを確認すると、基本的には、各方法にユーザーが許可されているかどうかを制限する必要があります。 。失敗した場合、ユーザは、エラー・メッセージを参照するか、より良い場所を__constructorを使用し、そこに、別に制限を置くべき貴様にユーザーの各レベルは

    +0

    モデルをもう一度チェックしてください。あなたのケースでは –

    +0

    のモデルが1つしかなく、あなたに応じて多くの方法があります。例を挙げましょう。インデックスとロールメソッドがあります。このメソッドでは、各メソッドに条件文を入れて、ユーザーがこのメソッドにアクセスできるかどうかをチェックする必要があります。あなたが100人の方法を持っているなら、あなたは100人になります。 –

    関連する問題