1

特定のページを表示する権限を持たないユーザーをブロックする方法を探しているだけです。codeigniterコアフォルダー内のバックエンドコントローラー内に関数をまとめて、すべてのバックエンドコントローラーに拡張させてみました。この関数をすべてのコントローラーの内部に配置するという DRY 原則を維持するために、関数を内部に配置したかったのです。

関数を書くための別の方法や、関数で何をすべきかについての別のアイデアを探しています。

public function view_allowed($user_data)
{
    if ($user_data->role_id != 4)
    {
        return false;
    }
    return true;
}

これにより、他のコントローラーのコンストラクト内で関数を呼び出し、それが false を返す場合は、そのページを表示するための適切なクレジットがないことを示す他のページに直接移動する if ステートメントを実行します。

ご質問、コメント、懸念事項はありますか?

編集2:

これが何をするかを考えているので、編集しなければなりませんでした。これの目的は、通常のユーザーが表示できず、管理者のみが表示できる各コントローラー構成で関数を実行することです。したがって、次のようにすると、ユーザーがそのページを表示できない場合に別のページにリダイレクトすることをどのように知ることができますか。

<?php

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

class Recent_activities extends Backend_Controller
{
    /**
     * Load the parent construct and any additional models, helper, libraries available. 
     * @return void 
     */
    public function __construct()
    {
        parent::__construct();
        $view_allowed = view_allowed($user_data);
    }

    public function index()
    {
        $this->breadcrumb->add_crumb('<li><a href="' . site_url() .
            'control-panel/activities/recent-activities">Activities</a></li>');
        $this->breadcrumb->add_crumb('Recent Activites');

        $activities = $this->user->get_all();

        $this->template
            ->title('Recent Activites')
            ->build('recent_activities_view');
    }
}
4

3 に答える 3

1

このためのヘルパー関数を作成します。

if(!function_exists('view_allowed'))
{
    function view_allowed($user_data=null)
    {
        if($user_data->role_id != 4)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

これは、ヘルパー関数を設定する方法に関する良い投稿ですhttps://stackoverflow.com/a/804520/1893629

コントローラーで

$this->load->helper('new_helper');

//pass in $user_data
//will return true or false
$view_allowed = view_allowed($user_data);

Edit 2 の更新:

<?php

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

class Recent_activities extends Backend_Controller
{
    /**
     * Load the parent construct and any additional models, helper, libraries available. 
     * @return void 
     */
    public function __construct()
    {
        parent::__construct();
        $view_allowed = view_allowed($user_data);

        if(!$view_allowed)
        {
            redirect('go/to/a/new/page');
        }
    }

    public function index()
    {
        $this->breadcrumb->add_crumb('<li><a href="' . site_url() .
            'control-panel/activities/recent-activities">Activities</a></li>');
        $this->breadcrumb->add_crumb('Recent Activites');

        $activities = $this->user->get_all();

        $this->template
            ->title('Recent Activites')
            ->build('recent_activities_view');
    }
}
于 2013-08-12T22:50:25.093 に答える
1

こんな感じでフックを使います。

/* Location: ./application/config/hooks.php */    
$hook['post_controller_constructor'] = array(
                                    'class'    => 'security',
                                    'function' => 'checkLogin',
                                    'filename' => 'security.php',
                                    'filepath' => 'hooks/security'
                                 );

そして、セキュリティ:

class Security{

    var $CI;
    var $class;

    public function __construct() {
        $this->CI =& get_instance();

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

                //check permission
    }
}

コントローラーコンストラクターが呼び出された後、毎回呼び出されます。DRYだと思います。

それが誰かを助けることを願っています。

于 2014-02-12T00:20:15.237 に答える