WEBシステムで管理者用のシステム管理画面等を作った場合、何もしなければURLを叩けば画面が表示されてしまう。データベースを操作するような画面が誰にでも見えてしまうのはまずい。
そこで、そういう管理画面のような表示したくない画面を表示しようとした場合ログイン画面で認証が行われていなければログイン画面へ強制送還されるようにする。
まず、「/CakePHP/cake/lib/controller/app_controller.php」を「/
CakePHP/app/app_controller.php」にコピーします。
「app_controller.php」の中身というのはコメントを除くと
<?php class AppController extends Controller { } ?>
となってます。そうです、空のコントローラークラスです。ここに処理を記述すると全ページでまず、この処理をしてくれます。それを利用して認証方式でログイン画面でパスワード認証行っていない場合は強制送還させるようにします。
まずはログイン用のビュー(画面)を作り、受け取ったあとの処理用のコントローラーを設定します。
function login(){ if(!empty($this->data)){ if($this->data['password'] == 'password1234'){ $this->Session->write('ninsyo',$this->data['password']); $this->redirect('/mainte_data/main_menu'); } else{ $this->set('out1','パスワードが違います。'); } } else{ } }
要はパスワード認証を通ったら、それをセッションに書き込み「AppController.php」でチェックする。
<?php class AppController extends Controller { function checkSession(){ if(!$this->Session->check('ninsyo')){ $this->redirect('/members/login'); } else if($this->Session->read('ninsyo') != 'password1234'){ $this->redirect('/members/login'); } } } ?>
セッションの中身がない場合、中身があってもパスワードが違っている場合はログイン画面へ強制送還する。これが全てのページで行われるようになるので認証を行っていない場合はは管理画面のページが表示されることはなくなる。
最後に管理画面用のコントローラーで
function beforeFilter(){ $this->CheckSession(); }
functionの一番最初に先ほどのAppControllerのcheckSession()を呼び出すようにするとそのコントローラーの全てのページでまず最初に認証処理がされるようになる。「beforeFilter」が肝。