認証(Authモジュール)による制御[kohana 3.x]
「Authモジュールによる認証[kohana 3.x]」で認証を行う部分を作成しました。
ここでは、認証した後の処理を見てみます。この例では認証を必要とするかどうか?やアクション単位での制限を行うかどうか?といった設定が行えます。
コントローラーの作成
Controller_Templateクラスを継承して認証状態を確認する処理を追加したコントローラーを作成します。
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Template_default extends Controller_Template {
public $template = 'templates';
// 認証を必要とするかどうか?また、どのロールが?
public $auth_required = FALSE;
// アクション毎の制御を行うか?また、どのアクションに対してどのロールが?
public $secure_actions = FALSE;
public function before()
{
parent::before();
// セッションの作成
$this->session= Session::instance();
$action_name = Request::instance()->action;
if (($this->auth_required !== FALSE && Auth::instance()->logged_in($this->auth_required) === FALSE)
|| (is_array($this->secure_actions) && array_key_exists($action_name, $this->secure_actions) &&
Auth::instance()->logged_in($this->secure_actions[$action_name]) === FALSE))
{
if (Auth::instance()->logged_in()){
Request::instance()->redirect('account/noaccess');
}else{
Request::instance()->redirect('account/signin');
}
}
if($this->auto_render)
{
// Initialize
$this->template->meta_keywords = '';
$this->template->meta_description = '';
$this->template->meta_copywrite = '';
$this->template->title = '';
$this->template->content = '';
$this->template->styles = array();
$this->template->scripts = array();
}
}
public function after()
{
if($this->auto_render)
{
}
parent::after();
}
}
制限をかけてみる
上記、Controller_Template_defaultを継承して実際に制限をしてみます。
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Admin extends Controller_Template_default {
// adminロールがある場合のみ実行可能とする
public $auth_required = array('admin');
function action_index(){
$this->template->content = View::factory('admincontents');
}
}
この例では、adminロールが設定されたユーザーのみ実行可能となります。ロールが設定されて無い場合、 account/noaccessへリダイレクトされます。
次にアクション別に制限をかけてみます。
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Admin extends Controller_Template_default {
public $secure_actions = array('post' => array('login','admin'),
'edit' => array('login','admin'),
'delete' => array('login','admin'));
function action_index()
{
$this->template->content = View::factory('infomation');
}
function action_post()
{
$this->template->content = View::factory('postarticle');
}
function action_edit()
{
$this->template->content = View::factory('editarticle');
}
function action_delete()
{
$this->template->content = View::factory('deletearticle');
}
}