管理画面へのアクセスをIPで制限

CakePHPで開発してて、管理画面(admin)へのアクセスはIPで制限したいな

という場合の設定方法

昔、componentとか駆使して設定したことがありますが、もっと簡単な方法がありました。
htaccessを使う方法です。

/webroot/admin のディレクトを作ります。

そのadminディレクトリにhtaccessを置きます。

order deny,allow
deny from all

# 許可したいIP
allow from 1.0.16.0

特定のURLで404エラー!

CakePHPで開発中、ある特定のURLの場合のみ404エラーが発生しました。

一意のURLを生成するためにbase64_encodeなどを駆使して生成したURLで発生。

色々調べてみると…

base64の使用文字
「a-zA-Z0-9+/」
この最後の「/」が問題のようだ。
urlencodeして使用していたけど×

mod_rewriteでURLに「%2F(スラッシュをurlencodeした文字)」が入っていると404を返すらしい。

それを解決するには、「AllowEncodedSlashes On」にすると解決できるそうだ。
これはデフォルトだとOffになっているため、先に%2Fをスラッシュとして認識し、URLが見つからないと404を返すと。。

んじゃ、Onにして解決だね!

と言いたいところだけど、それはちょっと難しい。

これはApacheの設置httpd.confなどで設定するものらしい。
htaccessでは解決できない。
レンタルサーバーなどでは簡単に変更できないので詰んでしまう・・・・

ということで、私は単純にqueryでgetとして送信することで回避させました。

https://zero-one-x.com/xxxx%2Fxxx

↓↓↓↓

サイト

CakePHP2でセッションが途中で切れる問題

CakePHPでセッションが途中で切れるという現象に遭遇しました。

テストサーバーでは問題ないけど、本番サーバーに移すと症状が発生。

有効期限を30日にしているが、1時間ほどでセッション切れを起こす。

開発ツールを使って、セッションを見てみると、
なぜかセッションが2個発行されている。
1個はCakePHPで発行したもの。
もうひとつが謎のセッション

セッションの説明に下記の注意書きがありました。

https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime


----------
注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。
このような場合には、 お互いに session.save_path を使用します。
----------

なぞのセッションが1時間になっていて、それに巻き込まれてセッション切れを起こしているようでした。
サーバーはGMOクラウドサーバー

謎のセッションをどうすることもできない。
htaccessでの変更もエラーが出てできません。

save_pathを変える方法で対応します。

CakePHPのcore.phpを変更

‘defaults’ => ‘php’

↓↓↓変更↓↓↓

‘defaults’ => ‘cake’

これでセッションが/tmp/sessionsに生成されます。

セッションの巻き込み事故回避完了!

CakePHP2.10の認証でACLのエラーが・・・

CakePHP2.10でAuthコンポーネントを使って認証機能を作った。

ID、パスワード認証までは問題なかったが、認証後に別のページにアクセスしたらACLのエラーが出て困った。

Error: Table aros_acos for model Permission was not found in datasource default.

コンポーネントでACLの読込はしてないのに上記エラーが出てる。

検索しても情報が出てこなかった。

ソースを追ったりして色々調べてみたら下記の設定が原因だった。

$this->Auth->authorize = ‘actions’;

上記設定をするとACLを読み込んでACLの機能でチェックするらしい。

AUTHだけ使う場合は上記設定はなくていいみたい。

CakePHP2.xでデバッグキットを使う

CakePHP2.xでデバッグキットを使いたい~

デバッグキットをダウンロードします。

https://github.com/cakephp/debug_kit/tree/2.2

ダウンロードファイルを解凍したら「DebugKit」に名前を変更して、
cakephpのpluginsフォルダに移動させます。

bootstrap.phpに下記を追加


CakePlugin::load('DebugKit');

次に/app/Controller/AppController.phpに下記を追加

public $components = array('DebugKit.Toolbar');

/app/View/Layouts/default.ctp の sql_dump 部分を削除

<?php echo $this->element('sql_dump'); ?>

以上です。

CakePHP2で認証処理

CakePHP2で認証処理を追加する方法

AppContorller.php

public $components = array(
	'Auth' => array(
		'loginAction' => array(
			"controller"=>"login",
			"action"=>"index"
		),
		'loginRedirect' => array(
			'controller' => 'posts',
			'action' => 'index'
		),
		'authenticate' => array(
			'Form' => array(
				'passwordHasher' => 'Blowfish',
				'hashType' => 'sha1',
				'userModel' => 'Users',
				"fields"=>array(
					"username"=>"account",
					"password"=>"password"
				)
			)
		)
	)
);

loginAction: ログインフォームのページを指定
loginRedirect: ログイン処理後に移動するページを師弟
authenticate: 認証処理の種類を指定

User.php(モデル)

App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
	// ハッシュ処理
	public function beforeSave($options = array()) {
		if (isset($this->data[$this->alias]['password'])) {
			$passwordHasher = new BlowfishPasswordHasher();
			$this->data[$this->alias]['password'] = $passwordHasher->hash(
				$this->data[$this->alias]['password']
			);
		}
		return true;
	}
}

パスワードをハッシュ化する処理

ログイン処理をします。

LoginController.php

class LoginController extends AppController{
	public function initialize() {
		parent::initialize();
	}	

	//コントローラー
	public function index() {
		$this->loadModel("Users");

		if($this->request->is('post')){//POST送信なら
            if($this->Auth->login($this->data["Users"])){//ログイン成功なら
                return $this->redirect($this->Auth->redirectUrl()); //Auth指定のログインページへ移動
            }else{ //ログイン失敗なら
                $this->Flash->error(__('ユーザ名かパスワードが違います'));
            }
        }
	}
}

AppControllerでAuthの処理を指定しているので、認証をしたくないページにはコントローラーに下記の処理を追加します。
actionを指定すると認証の処理を省けます。

	/**
	 *  Controller内共通設定
	 */
	public function beforeFilter(){
        $this->Auth->allow('index', "view", "edit", "add");
	}