『Codeigniter』の認証管理にアノテーションを利用してみた

『Codeigniter』の認証管理にアノテーションを利用してみた

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

ショーケース・ティービーで展開するサービスを開発するために、PHPのフレームワーク『Codeigniter(読み:コードイグナイター)』を使うことになりました。
<参照:CodeIgniter『CodeIgniter Web Framework』(英語サイト)>

試行錯誤しながらなんとか完成にまで漕ぎ着けました。しかし……

  • コードが長い
  • 毎回判定(if)する書き方をしてしまいがちで、結果的に無駄が多い
  • コーディングミスやバグを出しやすい書き方をしてしまっている

私自身が経験不足であることは否めず、かなり荒い作りに……。精進します。。。

そんなことで少しばかり悩んでいた時に、同じ開発メンバーのプレゼンテーションの中で、ひょっとしたらこれら課題が解消できるかもしれない方法の紹介がありました。

これはもう実践あるのみ!
さっそく実装してみることにしました。

セキュリティモジュール『ci-security-module』とは!?

そのプレゼン内で紹介されたのは、『Codeigniter』でコメント内のアノテーションを利用したセキュリティモジュール『ci-security-module』でした。

この『ci-security-module』はユーザの認証状態や権限に応じて、アノテーションでルーティングを制御するというシンプルなもの。
そして、何と言ってもショーケース・ティービー謹製です!

Symfony」や「Laravel」といった他のフレームワークなどでは、既にセキュリティモジュールがあったりします。
しかし、『Codeigniter』にはセキュリティモジュールがなかったため、「じゃあ作ろっか」ということで作成されたものであります。

これは使わない手はありません。
管理画面が存在するショーケース・ティービーのサービス『仲介名人』で実施。
『ci-security-module』自体をオープンソースとしてモジュール化にしていたので、カンタンに使うことができました。
<参照:GitHub『ci-security-module』>

導入方法のご紹介

上でご紹介しているGitHub内にマニュアルも併記しております。
今回はその手順通りに進めてご紹介いたします。

■手順1

「composer.json」をダウンロードし、『Codeigniter』の「config.php」を以下のように変更します。

$config['composer_autoload'] = TRUE;

マニュアルどおりに進めてみましたが、いきなりエラーが発生w
どうやら自分の環境で利用するためには、以下のような書き方にしないとダメみたいですね。

$config['composer_autoload'] = APPPATH;

■手順2

「hooks」も有効にしておきましょう。

$config['enable_hooks'] = TRUE;

■手順3

「application/config/hooks.php」に以下を追加します。

$hook['post_controller_constructor'][] = function() {
    $listener = new \SCTV\Security\Hook\AuthListener();
    $listener->postControllerConstructor();
};

はい、これだけで導入準備は終わりです。
カンタンですね!

『ci-security-module』でどれだけ便利になるのか!

アクセス制御したいcontrollerに以下の数行を追加します。


これまでログインした人の情報はセッションに全部追加して、ユーザの名前を表示させたり、ユーザに与えた権限でページの非表示を切り替えたりしていました。
それが『ci-security-module』では、以下のようにスッキリ書けるようになっているんですね。

before

public function test(){
    $this->load->library(‘session’);
    if($this->session->userdata(“is_logged_in”)){
        $this->load->model(“Model_login/Model_login”);
        $data[“user_data”] = $this->session->all_userdata;
        $this->load->view(“header”,$data);
        $this->load->view(“test”);
        $this->load->view(“footer”);
    }else{
        redirect(‘login’);
    }
}

after

public function test(){
    $this->load->model(“Model_login/Model_login”);
    $data[“user_data”] =\SCTV\Security\Security\SecurityContext::getInstance()->getUser();
    $this->load->view(“header”,$data);
    $this->load->view(“test”);
    $this->load->view(“footer”);
}

また、これまではviewに直接データを渡していましたが、渡さなくて済むようになりました。

before

 ユーザー権限に2を与えられてる人が見れるページ’;
    echo ‘
  • ユーザー権限に2を与えられてる人が見れるページ2
  • ’; } ?>

    after

    
     
    hasRole([‘2’])){
        echo ‘
  • ユーザー権限に2を与えられてる人が見れるページ
  • ’; echo ‘
  • ユーザー権限に2を与えられてる人が見れるページ2
  • ’; } ?>

    『ci-security-module』を使って私の中にも変化が!

    セキュリティモジュール『ci-security-module』を導入したことで、私の課題が以下のように変わりました!

    • コードが長い
            → 短縮に成功!
    • 毎回判定(if)する書き方をしてしまいがちで、結果的に無駄が多い
            → 無駄なif文がなくなった!
    • コーディングミスやバグを出しやすい書き方をしてしまっている
            → コーディングミスは減らせそう!

    『Codeigniter』を使っていて、かつ、管理画面が存在するサービスには最適!
    どんなものでもカンタンに導入できそうです!!

    興味がある方、私と同じような悩みを抱えていた方は、ぜひ『ci-security-module』をダウンロードの上、お試しください!

    それでは、また!

    ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

    【週刊bitWave】(メルマガ)始めました!

    登録はこちらからメールアドレスを入力してお申込みください。

    ご登録いただいたメールアドレスは 【週刊bitWave】の更新情報の配信にのみ使用します。

    個人情報の取扱いに関しては、「プライバシーポリシー」をご確認ください。解除はいつでもこちらから行うことが可能です。

    あなたにおすすめ