CakePHP AppControllerで全てのページで認証処理

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-&gt;data)){
    if($this-&gt;data['password'] == 'password1234'){
    $this-&gt;Session-&gt;write('ninsyo',$this-&gt;data['password']);
    $this-&gt;redirect('/mainte_data/main_menu');
    }
    else{
    $this-&gt;set('out1','パスワードが違います。');
    }
  }
  else{
  }
}

要はパスワード認証を通ったら、それをセッションに書き込み「AppController.php」でチェックする。

<?php
class AppController extends Controller {

function checkSession(){
 if(!$this-&gt;Session-&gt;check('ninsyo')){
  $this-&gt;redirect('/members/login');
 }
 else
 if($this-&gt;Session-&gt;read('ninsyo') != 'password1234'){
  $this-&gt;redirect('/members/login');
 }
}

}
?>

セッションの中身がない場合、中身があってもパスワードが違っている場合はログイン画面へ強制送還する。これが全てのページで行われるようになるので認証を行っていない場合はは管理画面のページが表示されることはなくなる。

最後に管理画面用のコントローラーで

function beforeFilter(){
 $this-&gt;CheckSession();
}

functionの一番最初に先ほどのAppControllerのcheckSession()を呼び出すようにするとそのコントローラーの全てのページでまず最初に認証処理がされるようになる。「beforeFilter」が肝。

CakePHP1.3 コントローラーメソッド表示部分の文字化け対処

一から、PostgreSQLでデータベースを作成して、テーブルを作成して、CakePHPでコントローラーを作成して、モデルを作成して、scaffoldで表示してよしよしと・・・。

ここまではよかったんだけど、コントローラーメソッドの表示部分で文字化け・・・。

コントローラーのメソッド部分に

<?php
class RecordCardsController extends AppController {

var $name = 'RecordCards';
//public $layout = 'cake.recordcards';
public $scaffold;

function index() {
pr('↓test');
}

}
?>

といった感じで変数の中身を確認したりするときに多用するんだけど、それがこんな風に文字化けしてしまって、サータイヘン・・・。

CakePHPの「core.php」の設定やら、PostgreSQLの設定やらいろいろと調べたけど一向に状況が変わる兆しなし・・・。

そんな中文字コードがかかわる部分ってどこだろうなぁ~と考えている振りをして、うつらうつらと居眠りをしていると、「まさか!?」っと思って調べたらそのまさかでした。

自分はソースコードの編集にDreamweaverを使っているのですがそのソースコードのエンコーディングのプロパティが「日本語(シフト JIS)」になっていました。うー・・・基本中の基本やんけ・・・orz。

Dreamweaverでの変更方法は、メニュー→修正→ページプロパティ→タイトル/エンコーディング→エンコーディングをプルダウンメニューで「日本語(シフト JIS)」から「Unicode(UTF-8)」に変更して、文字化けは解決。

絶対また同じことをやると思うのでその時のために備忘録っと。

CakePHPでの内部関数の利用方法について

久々にCakePHPをいじっていると、以前自分が書いたこんなソースコードを見て

$this->_err01();//エラー処理1

「え?ちょっと何言ってるか意味わかんないんですけど・・・。」っとなったので備忘録。

コントローラー内で何度も同じ処理をする場合等に利用する。

$this->_err01();//エラー処理1

のようにすると、同じコントローラー内の別の自分のわかりやすい場所に下記のように記述しておくと何度でも呼び出すことができる。ソースコードもすっきり。

function _err01(){
エラー処理
...
...
...
}

内部関数(正しい言い方はなんて言うんだろ?)は頭に「_(アンダースコア)」をつけます。理由としては

  • URLが自動生成されない=ビューを作らなくていい
  • 外部の別のコントローラーから呼ぶことができない

外部から呼べた方がいいときもあるかもだけど、やり方が結構めんどそうなので今回は割愛。

参考サイト

http://www.ideaxidea.com/archives/2007/07/_cakephp_23.html

CakePHPで「<?xml version="1.0" encoding="UTF-8"?>」を宣言すると 「Parse error: syntax error, unexpected T_STRING in /var/www/html/・・・」とエラーメッセージが表示され真っ白にフリーズするときの対処法

基本的にプログラムを勉強した人間ではないので、PHPが吐き出すHTMLエラーなんて知ったこっちゃないよっと思っていたが、これを回避しているといろいろと勉強になるんだなぁ。

全部は回避できないかもだけど、可能な限りやってみようとすると早速です。

Parse error: syntax error, unexpected T_STRING in /var/www/html/hogehoge/app/views/layouts/hogehoge.ctp on line 1

なんてメッセージを吐き出し、真っ白な画面にエラーを表示してフリーズ・・・。

原因はメッセージ通りのhogehoge.ctpの1行目です。


<?xml version="1.0" encoding="UTF-8"?>

いや、あのさ、基本だ・・・まぁ・・いいや・・。

PHPを書き始める時に

<?php としますが

1行目の

<?

がカンにさわったようです・・・。

回避方法はこちら

<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>

PHPなんだからPHPで吐き出せはいいっつー話ですね、ハイハイ、ワカリマスタ・・。

参考サイト

http://astrodeo.com/blog/archives/165

CakePHPを1.2から1.3へ乗り換えたときの「URL rewriting is not properly configured on your server. 」と表示されるエラーメッセージの落とし穴

最近、大の苦手のPHPをいじる機会があって、CakePHPもVer2.0.2がリリースされていて、さすがにVer2.0.2に移行するとなると一から作り直した方が早いみたいだし、参考に本を本屋で探したがVer2.0.2の参考書は1冊もなし・・・orz

1.3なら参考書もあるし、それほど修正もいらないだろうと思ったのが大間違い、はまるわ、はまるわ、はまりまくり・・・これだからPHPはきらいだよ・・・orz

まずは環境を構築して、configフォルダを新しく設定して、それ以外のフォルダを1.2で作ったものをコピーしたら次のようなメッセージが表示された・・・。

CakePHP Ver1.3のエラー画面

URL rewriting is not properly configured on your server.

1.Help me configure it
2.I don’t / can’t use URL rewriting

画像には表示されていないが、エラーメッセージの下に上記のようなアドバイスがあり、1のリンク先に「mod.rewrite」の設定方法が書いてあります。

ここに大きな、大きな落とし穴が待っていました・・・Cakeバクハサレロ・・・

「mod.rewrite」関係の設定なんだなと、サーバーの「httpd.conf」やCakePHPの「.htaccess」を見直したり、書き直してみたり、新しく作り直してみたりとあれこれやってみるが一向にエラーメッセージは消えない。

そらぁ、そうだよ、原因はここじゃないから・・・モォユルシテ・・・

先ほど、「configフォルダ以外を丸ごとコピーした」と言ったけど、ここに上書きしてはいけないファイルがあったようです。

/cake/app/webroot/css/cake.generic.css

こいつが犯人です。このファイルが「mod.rewrite」と大きく関係していて、1.2と1.3では大幅に内容が違っていて1.2のファイルが上書きされたためにこのエラーが発生していました。

こいつを1.3のものと差し替えるとエラーは消え去りました・・・。
よかった!よかった!・・・ではなく俺の時間を返してください・・・(/_;)

1.2で作成したものを1.3に移行なんてことをしなければこんな落とし穴にはまることはないでしょう。

まだ始まったばかり・・・さらに大きな落とし穴がまっていそう・・・。