エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP 2.3 ログイン、操作履歴、アクセスログ出力

      2017/03/11

CakePHP 2.3系でログイン履歴、操作履歴、アクセスログなどのログ出力方法

 

ログ出力を作ることになった経緯

 
今回は、ログイン履歴、操作履歴、アクセスログといったログの出力に関しての説明です。
 
操作ログの出力に関しては、簡単に出力できるだろうと考えていたのですが、実は意外に実装が難しかったですね。(実はそれほど難しいものじゃないのですが、CakePHPの仕様を分かっていなくてさんざん悩んでしまった、というだけですが...)
 
最初はもしかすると、操作ログのプラグインがあるんじゃないか、とさえ思ったのですが、そこまで甘くはなかったわけです。
単純なすべてのアクセスのログを取るものや、SQLのログを取るものはありましたが、当然ながらオリジナルで作成している Webシステムに合わせて柔軟なログを出力したい、なんていう要望が叶えられるようなものはなかったワケです。
 
 

ログ出力をファイルに出力する方法

 
今回は、まず下記のサイトを参考に Vendor内に Classを作り、処理を構築しました。
http://neoinspire.net/archives/34#.UfXaItaChph
 
ちなみに、Vendorに設置した classの呼び出し方法は、CakePHP2.Xでは変更になっていますので、下記のサイトを参考にしました。
http://www.monoreview.com/?p=35
 
————–(/app/Vendor/accesslogs.php)

————–
 
————–(/app/AppController.php)

————–
 
続けて、「cake/app/tmp/logs/」の中に「accesslogs」というフォルダを作ってください。
Linux系のサーバであれば、書き込み権限を設定してください。
 
これで、上記に作成したフォルダの中にログが出力されるようになります。
 
非常に簡単にアクセスログを出力する処理が作れましたので、これは今後の勉強になったかと思っています。
ですが、これをいざ実際に必要としているログイン履歴や、各ページでの操作ログを DBに保存させる処理に拡張しよう、としたら途端に分からなくなったのです。
 
 


 

ログ出力データベースに保存する方法

 
そんなわけで、寄り道も含めて、全く違う方法で DBにログを保存する方法を探したところ、参考になりそうな下記のサイトが見つかりました。
http://pc.casey.jp/archives/750
 
こちらを参考にしながら、テーブル名は、Historyに変更し、認証処理など不要な項目を削除しました。
 
————–(テーブル)

————–
 
————–(/app/HistoriesController.php)

————–
 
「class AppController extends Controller」の中に「write_log」の関数を編集します。
 
————–(/app/AppController.php)

————–
 
————–(/View/Histories/admin_index.ctp)

————–
 
上記までの設定をすることで、ログ出力ができると思います。
一覧ページでリロードするたびにログのレコードが増えていくことが分かるでしょう。
 
 
これはこれで問題ないのですが、操作ログとして処理を作成する場合は、History以外のページでもログを出力する必要が出てきますので、その対応を作ってみました。
例えば、ログイン時にログインのログを出力する場合は、Usersでログを出力させる必要があると思いますので、まず「/Model/User.php」に Historyとの belongsToの設定を行います。
 
————–(/Model/User.php)

————–
 
続いて、「/app/HistoriesController.php」には、どのコントローラーからのアクセスなのかの情報を引数として設定します。
 
————–(/app/HistoriesController.php)

————–
 
さらに、「/app/AppController.php」でデータを保存する処理では、Userテーブルとの連携の設定を行います。(「HistoriesController.php」から送られてくるコントローラー名をもとに、テーブルの連携処理を振り分けます。)
これで、History以外のページからも Historyテーブルへログ保存の処理が行えるようになります。
 
————–(/app/AppController.php)

————–
 
この処理は、ログを出力するコントローラの数が増えれば増えるほど分岐が増えますので、もう少しいい書き方を検討する必要があるとは思いますが。
 
 
また、ログインの処理については、よくあるログイン処理をそのまま記述していると、「autoRedirect」が有効になっているため、ログイン認証が有効になったとたんに「loginRedirect」で設定してあるページに遷移してしまいます。
そのため、リダイレクトをさせる前にログ出力の処理を入れるためには、「autoRedirect」を無効にする必要がありますが、その設定に関しては、下記のサイトに分かりやすく説明がありました。
http://hima-j.in/cakephp/cakephp-last-login/
 
 

参考になるサイト

 
最後に、この記事を書くに当たって参考にしたサイトと自分でも書いてみた記事を紹介しておきます。
 
DBに値を保存する「save」メソッドに関しては下記の 2サイトが分かりやすく説明してありましたので、とても勉強になりました。
http://www.garacter.com/notes/cakephp/model/save
http://www.kaasan.info/archives/2543
 
また、下記の記事も書いていますのでご覧ください。
 CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll
 CakePHP 2.3で saveの便利な使い方・サンプルソース付き

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方

CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。

cakephp3 カスタムバリデーションを簡易的に実装する方法
cakephp3 カスタムバリデーションを簡易的に実装する方法

CakePHP3の独自のバリデーションをテーブルクラス内に簡単に記述する方法を解説。他のテーブルクラスでは使えないが、記述する量は少なく実装できるため、他で使わない処理を書くのには便利。

CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法

アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。

CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定

CakePHP3でOGPを設定する方法を解説。metaタグを編集するHTMLヘルパーを利用してOGPのタグを編集する。また、エレメントとして分割することでメンテナンス性も向上させる。

CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法
CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法

CakePHP4のfindListでキーと値のカラムを指定してテーブルにアクセスする方法がCakePHP5では「Deprecated(非推奨)」となった。推奨の記述方法を解説。

CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP4、CakePHP5のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP4の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた

CakePHPでレコードを新規登録をする際にnewEmptyEntity()を使って空のEntityを作成するが、これのempty、is_nullなどのでの判定結果がtrueかfalseか確認してみた。

CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法

CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。

CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説

CakePHPのログ出力方法の解説。app.phpにログ設定をし、スコープやレベルを指定してログ出力を振り分ける方法、CakePHP4で配列出力にはvar_exportが必要なことなどを解説。