カテゴリー: PHP (1ページ / 4ページ)

Cakephp2 ACL 導入メモ(User,Groupのシンプル設定、最低限の手順メモ)

かなりざっくりのメモ自分が思い出せるレベルです。(汗

  • Acl (アクセス – コントロール – リスト)
    アクセスを制御するシステム全体の事を言っている。(学生規則リストみたいな)
    具体的には ACLコンポネント全体と捉える。

  • ARO (アクセス – ロール:役割 – オブジェクト)
    アクセスを制御する役割の種類(校長、先生、生徒、生徒etc)
    具体的には arosテーブルで定義

  • ACO (アクセス – コントロール – オブジェクト)
    アクセスする実際のアクションを定義していく
    具体的には acosテーブルで定義

DBの準備

Allで使う。aros,caos,aros_acosの3つのテーブルの定義を以下のsqlを実行する。

/app/Config/Schema/db_acl.sql

Controller

AppController

  • コンポネント追加
public $components = array(
  'Acl',
  'Auth' => array(
    'authorize' => array(
      'Actions' => array('actionPath' => 'controllers')
    )
  ),
  'Session'
);
  • へるぱ追加;
public $helpers = array('Html', 'Form', 'Session');
  • beforeFilterへAuth関連追加(一旦すべてアクセス許可)
public function beforeFilter()
    {
        // AuthComponent の設定
        $this->Auth->loginAction = array(
            'controller' => 'users',
            'action' => 'login'
        );
        $this->Auth->logoutRedirect = array(
            'controller' => 'users',
            'action' => 'login'
        );
        $this->Auth->loginRedirect = array(
            'controller' => 'groups',
            'action' => 'index'
        );
        $this->Auth->allow();
    }

UserController

  • ログイン/アウト追加
public function login()
{
  if ($this->request->is('post')) {
    if ($this->Auth->login()) {
      return $this->redirect($this->Auth->redirect());
    }
    $this->Session->setFlash(__('Your username or password was incorrect.'));
  }
}

public function logout()
{
}
  • ログインのView
<?php
echo $this->Form->create('User', array('action' => 'login'));
echo $this->Form->inputs(array(
    'legend' => __('Login'),
    'username',
    'password'
));
echo $this->Form->end('Login');
?>

Model

UserModel

  • Acl関連ビヘイビア/メソッドなど
public $actsAs = array('Acl' => array('type' => 'requester', 'enabled' => false));

public function parentNode()
{
  if (!$this->id && empty($this->data)) {
    return null;
  }
  if (isset($this->data['User']['group_id'])) {
    $groupId = $this->data['User']['group_id'];
  } else {
    $groupId = $this->field('group_id');
  }
  if (!$groupId) {
    return null;
  } else {
    return array('Group' => array('id' => $groupId));
  }
}

public function bindNode($user) {
  return array('model' => 'Group', 'foreign_key' => $user['User']['group_id']);
}


public function beforeSave($options = array())
{
  $this->data['User']['password'] = AuthComponent::password(
    $this->data['User']['password']
  );
  return true;
}

GroupModel

  • Acl関連追記
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
  return null;
}

セットアップ

  1. ビューを設定
  2. グループ>ユーザ追加 (AROオブジェクトができる) arosテーブル
  3. ACOを作る(acos)
  4. パーミッション設定

1ビューの設定

CRUDなものは準備しておいたほうが良いかも
最低限は groupのindexとaddメソッドGroup::save()で、じどうでarosに追加される

Console/cake bake all

で一旦CRUD作ってもいいかも。(一旦元のController,Model,View逃してとかも)

2グループを追加

/groups/index
からグループ追加 > arosの追加を確認する

3AROを作る

ここからプラグインで、次のURLからDL

https://github.com/sams/alaxos_acl

READMEを参考に
– git cloneして、
– フォルダ名を’alaxos_acl’ > ‘Acl’に
– Config/bootstrap.phpに、’CakePlugin::load(‘Acl’, array(‘bootstrap’ => true));’
– Acl/Config/bootstrap.phpを編集以下を編集 ‘Group’ と ‘group_id’部分

Configure :: write('acl.aro.role.model', 'Group');

Configure :: write('acl.aro.role.foreign_key', 'group_id');
  • /admin/acl/にアクセス

  • [Actions] > [Build actions ACOs] > [Build] とオス。(acosテーブルに全Controller,Actionが追加される)

4パーミッション設定

-[Permissions] > [Roles permissions]と押すと一覧が表示される。
適切に設定して後は AppControllerの $this->Auth->allor()を消して動作確認まで

PHPStorm(WebStorm)でJSを自動で圧縮minifyする

Web開発のタスクランナーでgulpとかあるけど
PHPStorm(WebStorm)のFil Watchersが大分べんりで、JSの自動での圧縮も導入した。

FileWatcherにデフォルトで yuicompressor の設定があるらしいので、npmでインストール(グローバルに入れました。)

% npm install -g yuicompressor 

設定はそのままにしました。

試しに適当ななJSファイルを作ってみたら自動で圧縮ファイルができました。

ファイル名.min.js

と ‘min’を付加して保存してくれるみたい。

コードを書きながらどんどん自動でいってくれるみたい、

JSに関してはリアルタイムでなくてもよいのかなぁーとかも考でしたが、
FileWatcherは、TypeScriptなども簡単にWatchできるのでとても便利です。

一番うれしいのは、環境の設定などきにせず、GUIでちゃっと設定できるので便利。
ただ共同作業で進めるときはちゃんとタスクランナーの設定かかなきゃ。><

WordPressのサブディレクトリへの移動方法 /wp/などへ

いつも忘れてるのでメモ

1.管理画面で設定変更 ([設定] > [一般設定] )

(この時点で管理画面が表示できなくなるけど落ち着く。)

2.ファイルの移動

WordPressのファイル群を/wp/以下などに一式移動します。

3./index.phpの最後の方の wp-blog-header.phpへのパスの記述を変更

MAMPでPHPからRedisを簡単につかう。

とりいそぎ機能だけ試してみたい、アプリケーション側へ集中したいということでMAMPでPHPからRedisを簡単につかう方法。

こちらからコンパイル済のredis.soを取得して
(使いたいPHPのバージョン ※マイクロバージョンが違う環境でも動作できました。)

panxianhai/php-redis-mamp
https://github.com/panxianhai/php-redis-mamp

MAMPアプリケーションの以下のディレクトリに配置

/Applications/MAMP/bin/php/php5.x.x/lib/php/extensions/no-debug-non-zts-200xxxxx

メニューの [File] / [Edit Template] / [PHP] [PHP(自分のバージョン) php.ini を選択し以下を追記(最後でもどこでも)

extension=redis.so

MAMPを再起動,phpinfo()してみる。(redisが出てたらOK)

brewでredisをインストール

$ brew install redis

redisを起動

$ redis-server

サンプル実行

<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$redis->set("name","yamaaaaa");
echo $redis->get("name");

ブラウザでアクセスして出力確認

yamaaaaa

WordPressで特定のカスタムフィールドが入力されている記事をランダムに取得

WordPressで特定のカスタムフィールドが入力されている記事をランダムに取得する方法です。WP_Query関数を利用

CakePHPでHasManyのテーブルをカンマ区切りで取得(MySQL GROUP_CONCAT関数)

Modelのバーチャルフィールドに設定しちゃっておくとラク。

public $virtualFields = array(
 'tags' => '(select group_concat(Tag.name) from tags as Tag where Post.id = Tag.post_id)'
);

負荷とか考えて普段ははずしておきたい場合は動的に $Model->virtualFieldsは動的に変更できるのでその都度設定すれば問題なさそうです。

ただ、FIND_IN_SETでの検索が $Model->find() の ‘conditions’パラーメータでは実現できなかった。なにか方法あるのかなぁ。

今回は単純な Yearな数字だったたので 無理やり LIke %%で処理 (うーん。

さくらインターネットでCakePHPで好きなバージョンのPHPを動かしたいときなど

通常の場合だと。
/www/ドメイン名/.htaccess を作成し以下記述

Action myphp-script /php.cgi
AddHandler myphp-script .php

として  /www/ドメイン名/php.cgi を作成しパーミッションを755とかにして以下を記述

#!/bin/sh
exec /usr/local/bin/php-cgi
#exec /usr/local/php/5.4/bin/php-cgi
#exec /usr/local/php/5.3/bin/php-cgi
#exec /usr/local/php/5.2/bin/php-cgi
#exec /usr/local/php/4.4/bin/php-cgi

とすればうまくいくけど mod_rewrite の絡みでうまくいかなかったので、.htaccessへの記述とphp.cgiを/www/ドメイン名/app/webroot/以下に移動するとうまくいきました。

/www/ドメイン名/app/webroot/.htaccess

Action myphp-script /php.cgi
AddHandler myphp-script .php

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

/www/ドメイン名/app/webroot/php.cgi

#!/bin/sh
exec /usr/local/bin/php-cgi
#exec /usr/local/php/5.4/bin/php-cgi
#exec /usr/local/php/5.3/bin/php-cgi
#exec /usr/local/php/5.2/bin/php-cgi
#exec /usr/local/php/4.4/bin/php-cgi

(2行目のデフォルトのバージョンをコメントアウトして、使いたいバージョンの行のコメントアウトを外す感じで。)

 

CakePHPでセッションCookieがセキュアにならなかった。(CakeSessionコンポネント)

CakePHP + AWSのロードバランサーでCookieがセキュアにならなかった件。

CookieComponentの設定では、secure = true;となっています。
ソースコードを追っかけたところ、CakeSessionComponentで、

if (!isset($sessionConfig['ini']['session.cookie_secure']) && env('HTTPS')) {
 $sessionConfig['ini']['session.cookie_secure'] = 1;
 }

となっている所があり設定にかかわらずenv(‘HTTPS’)が空の場合にはセッションCookieがセキュアにならない設定に。

今回はサイト全てhttpsなのでELB以下のAhache(htaccess)でsetEnvしてセットして対応

setEnv HTTPS 'on'

(本当は、X-Forwardedヘッダー参照して ‘on’ or ”(空)にする対応が必要ですが取り急ぎまで)

 

 

CakePHPのFileBinderプラグインで日本語ファイル名のアップロードに対応する方法。

サービスで使っているCakePHPのFileBinderプラグインで、日本語の画像ファイルのアップロードに対応してほしいとのリクエスト(まぁそうだよね。。)

//ファイル名をfield名に強制変換
foreach($this->request->data['Detail'] as $key => $file){
   $extension = pathinfo($file['name'], PATHINFO_EXTENSION);
$this->request->data['Detail'][$key]['name'] = $key.'.'.$extension;
}

WordPressみたいにきちんとアップロードすることもできるけど大変なので、
上のように無理やりフィールド名に変換 (特に利用者が画像ファイル一覧を管理したりがないので強引に。)

 

PHPで第1土曜日、第x,x曜日

 $firstDayTime = strtotime(date('Y-m-01',$time));
 $lastDayTime = strtotime(date('Y-m-t',$time));
 $num = 0;
 $startWday = date('D',$time);
 for($currentTime = $firstDayTime; $current<= $lastDayTime; $currentTime +=$oneDayTime ){
 $wDay = date('D',$currentTime);
 if($startWday == $wDay){
 $num++;
 }
 if($currentTime==$time){
 break;
 }
 }
 $wday = strtolower(date('D',$time));
 echo $num.':'.$wDay;

1 / 4ページ

Powered by WordPress & Theme by Anders Norén