アクセス権の差別化Kohana 3.3

画像

Cohanにはユーザー認証モジュールが組み込まれています。 データベースにはすでにロールを持つテーブルがあります。 しかし、インターネットのスペースをめぐって、アクセス権を差別化することがどれほど便利かはわかりませんでした。 したがって、この問題に対する私の解決策を提供します。



始めましょう


1つの共通Common.phpからすべてのコントローラーを継承し、その中のプロジェクトの基本設定(CSS、JS、ヘッダー、コンテンツの接続、すべての構成のロードなど)を規定します。 プロジェクトに必要なものに応じて。



まず、他のコントローラーで役立つすべてのものを発表します。



<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Common extends Controller_Template { public $sys_mes, $auth, $session, $user, $class_id; public $user_roles = array(); public $security = array(); public $template = 'v_common'; public $layout = 'v_column_12'; public $css = array('bootstrap.min', 'style'); public $js = array('jquery-2.0.0.min', 'bootstrap.min'); public $configs = array('order_control', 'payment_method'); }
      
      







次に、コントローラーがページをロードする前に起動する関数を作成します。 必要な設定のみを以下に説明します。 ロールのリストはセッションで記録できます。



区別する関数は_check_permission()です



 public function before() { parent::before(); #  $this->auth = Auth::instance(); $this->session = Session::instance(); $this->class_id = Get_class($this); #    if($this->auth->logged_in()) { #   $this->user = $this->auth->get_user(); #     $this->user_roles = Model::factory('User')->user_roles($this->user->id); } #    $this->_check_permission(); #   foreach($this->configs as $config) { $this->template->set_global($config, Kohana::$config->load($config)->as_array()); } }
      
      







ロールのリストを取得するためのモデル。 ここではすべてが明確です。



 class Model_User extends Model_Auth_User { public function user_roles($user_id) { $result = array(); $db = DB::select(array('roles.name', 'name')); # SELECT -> ROLES_USERS $db->from('roles_users'); $db->where('roles_users.user_id', '=', $user_id); # SELECT -> ROLES $db->join('roles'); $db->on('roles.id', '=', 'roles_users.role_id'); $roles = $db->execute()->as_array(); foreach($roles as $role) { array_push($result, $role['name']); } }
      
      







アクセスを制限する関数自体。 コントローラーのディレクトリに関係なく、それは必要に応じて動作します。



  private function _check_permission() { $check_permission = FALSE; $config_security = Kohana::$config->load('security')->as_array(); $action = Request::current()->action(); if(isset($config_security[$this->class_id][$action])) { foreach($config_security[$this->class_id][$action] as $users_role) if(in_array($users_role, $this->user_roles) || in_array($users_role, array('public'))) $check_permission = TRUE; } if(isset($config_security[$this->class_id]['all_actions'])) { foreach($config_security[$this->class_id]['all_actions'] as $users_role) if(in_array($users_role, $this->user_roles)) $check_permission = TRUE; } if($check_permission != TRUE) exit('Access deny - 403 '); }
      
      







設定はここにありますapplication / config / security.php



その中にアクションにアクセスする許可を書きます。そうでなければ403を取得します。



 <?php defined('SYSPATH') or die('No direct script access.'); return array( # Order 'Controller_Orders' => array( 'index' => array('root', 'manager', 'admin'), 'by_organization' => array('root'), 'add' => array('admin', 'manager'), 'edit' => array('admin', 'manager'), # Auth 'Controller_Auth' => array( 'all_actions' => array('login'), 'login' => array('public'), ), # Organization 'Controller_Organization' => array( 'all_actions' => array('root'), ), );
      
      







Controller_Orders-コントローラーの名前。

index-動作するアクション(すべてのユーザーにアクセスを許可したい場合は、「all_actions」を記述します)

array( 'admin'、 'manager')-アクセスが許可されているロールのリスト。



問題を解決するこの方法についてのあなたの意見を知ることは興味深いです。



All Articles