3月 162013
 

今回はユーザの作成方法を書いていきます。大体は公式のgithubにあるマニュアルを見れば大体は把握できるのでまぁまとめなくても・・・って少し思ってたりする。

一応、こちらの記事と前回作った記事はFuelPHP勉強会 東京 vol.3である程度まとめた形で発表予定です。5分だから・・・ざっくりして、短くなりそう。

ユーザを作成する

Exception一覧

・Cartalyst\Sentry\Users\LoginRequiredException
ログインフィールド(通常はEmail)が抜けている場合に投げられるExcepion
Sentryのconfig/sentry.phpの’login_attribute’で対象カラムを変更可能

・Cartalyst\Sentry\Users\PasswordRequiredException
パスワードフィールドが抜けている場合に投げられるException

・Cartalyst\Sentry\Users\UserExistsException
ログインフィールドが既に存在した時に投げられるException

・Cartalyst\Sentry\Groups\GroupNotFoundException
グループがない場合に投げられるException

例(殆どGithubと同様ですが、日本語化してます。)

try
{
    // ユーザを作成する
    $user = Sentry::getUserProvider()->create(array(
        'email'    => 'john.doe@example.com',
        'password' => 'test',
    ));

    // グループの情報を取得
    $adminGroup = Sentry::getGroupProvider()->findById(1);

    // ユーザをグループに追加する
    $user->addGroup($adminGroup);
}
catch (Cartalyst\Sentry\Users\LoginRequiredException $e)
{
    echo 'メールアドレス項目は必須です。';
}
catch (Cartalyst\Sentry\Users\PasswordRequiredException $e)
{
    echo 'パスワード項目は必須です。';
}
catch (Cartalyst\Sentry\Users\UserExistsException $e)
{
    echo 'すでにそのメールアドレスは登録済みです。';
}
catch (Cartalyst\Sentry\Groups\GroupNotFoundException $e)
{
    echo 'グループがありません。';
}

パーミッションを設定する方法

パーミッションはユーザを作成する時と、別でセットをすることも可能。

// ユーザを作成する
$user = Sentry::getUserProvider()->create(array(
    'email'       => 'john.doe@example.com',
    'password'    => 'test',
    'permissions' => array(
        'user.create' => -1,    // ユーザを作成出来るか
        'user.delete' => -1,    // ユーザを削除出来るか
        'user.view'   => 1,     // ユーザを閲覧出来るか
        'user.update' => 1,     // ユーザを更新出来るか
    ),
));

Usersクラスの場合にはパーミッションの値に3つの値が存在します。

-1:拒否
 1:許可
 0:継承

継承はグループを継承するのだと思われます。

補足

パーミッションは複数作ることが可能です。自分で名前を決めても問題ありません。(多分)パーミッションを確認するためには、hasAccessメソッドを使用することで判定ができます。

try
{
    // ユーザを取得する
    $user = Sentry::getUserProvider()->findById(1);

    // そのユーザがadminパーミッションに対応しているかどうか(アクセス出来るかどうか)を判定
    // 複数のパーミッションを指定する際には、配列で指定
    if ($user->hasAccess('admin'))
    {
        // そのユーザがアクセスが出来る時の処理
    }
    else
    {
        // そのユーザがアクセス出来ない時の処理
    }
}
catch (Cartalyst\Sentry\UserNotFoundException $e)
{
    echo 'そのユーザは存在しません。';
}

ユーザを作成して、認証を行う

Sentryでは、ユーザの認証を行うことが可能です。例えばユーザを作成→メールが送信される→メールに載ってある文字列を貼って認証という形が簡単に作ることが出来ます。

Exception一覧

・Cartalyst\Sentry\Users\LoginRequiredException
ログインフィールド(通常はEmail)が抜けている場合に投げられるExcepion
Sentryのconfig/sentry.phpの’login_attribute’で対象カラムを変更可能

・Cartalyst\Sentry\Users\UserExistsException
ログインフィールドが既に存在した時に投げられるException

例(登録時)

try
{
    // ユーザを登録する
    $user = Sentry::register(array(
        'email'    => 'john.doe@example.com',
        'password' => 'test',
    ));

    // 認証用のコードを取得
    $activationCode = $user->getActivationCode();

    // 対象のユーザにアクティベーションコードを送信する
}
catch (Cartalyst\Sentry\Users\LoginRequiredException $e)
{
    echo 'Login field is required.';
}
catch (Cartalyst\Sentry\Users\UserExistsException $e)
{
    echo 'User with this login already exists.';
}

例(アクティベーション時)

try
{
    // ユーザを取得
    $user = Sentry::getUserProvider()->findById(1);

    // アクティベーションを判定
    if ($user->attemptActivation('8f1Z7wA4uVt7VemBpGSfaoI9mcjdEwtK8elCnQOb'))
    {
        // アクティベーションが出来た
    }
    else
    {
        // アクティベーション出来なかった
    }
}
catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
{
    echo '該当のユーザがいません。';
}
catch (Cartalyst\SEntry\Users\UserAlreadyActivatedException $e)
{
    echo 'すでにこのユーザは認証済みです。';
}

はい。ここまで。ログイン等のシステムも充実していて使いやすそう。

 Posted by at 11:37 PM
3月 112013
 

FuelPHPでSentryを使おう

こんばんは。ファガイです。個人的にSimpleAuthが好きになれなかったのでSentryという認証システムを使うことにしましたよっと。

Sentryは複数のフレームワークに対応する認証システムであり、composerでのインストールが可能。FuelPHP1.6からはcomposerに標準対応するということで、使ってみようかなと。

2015-04-22追記
※最新版は2.1系です。この記事は2.0系向けの記事となります。
最新の2.1系ではテーブル情報が変わっている模様なので、テーブルの作成はschemaフォルダmysql.sqlを利用してください。

Sentryの利点

  • 複数フレームワークに対応している(Laravel,FuelPHP,CodeIgniter等のフレームワークに対応)
  • フレームワーク無しでも動く
  • 何となく良さそうな気がする

Sentryは当初、FuelPHP用に作られていたのか不明だが、FuelPHPパッケージ版もある。けどcomposerでいいよね・・。

導入

まずは、composer.pharを用意しなくてはいけません。composerはhttp://getcomposer.org/composer.pharから取得が出来ます。

用意出来たらfuel/app内にcomposer.pharを入れます。
次に、DLをするためにcomposer.jsonを同じフォルダ内に用意します。これはSentryのgithubに載っています。(https://github.com/cartalyst/sentry)

composer.json

{
    "require": {
        "cartalyst/sentry": "2.0.*",
        "illuminate/database": "4.0.*",
        "ircmaxell/password-compat": "1.0.*"
    },
    "minimum-stability": "dev"
}

用意が終わったらインストールしましょう。

php composer.phar install

次はfuel/app/bootstrap.phpに2行を付け足す。
公式にAutoloader::register();以降に記述と書かれているため、その下に付け足しましょう。

// Enable composer based autoloading
require APPPATH.'vendor/autoload.php';

//Sentry用のエイリアス
class_alias('Cartalyst\Sentry\Facades\FuelPHP\Sentry', 'Sentry');

以上です。

これで基本はSentry自体の導入は完了。残りはテーブルを用意します。
ここからは一気に。

usersテーブル(usernameカラムは無くても良いです。カラムは自由に追加してOK)

追記
因みに、ninjauthにそのまま対応させるのであれば、こちらを使用。(とかいいつつninjauthのsentry用の設定が古いので結局書き換えは必要。first_name,last_nameが追加です)

作られたmigrationのphpにユニークキーを付け足す。

\DBUtil::create_index('users', 'email', 'users_email_unique', 'UNIQUE');

groupsテーブル(グループ管理用のテーブル。permissionsに制限情報をいれる)

作られたmigrationのphpにユニークキーを付け足す。

\DBUtil::create_index('groups', 'name', 'groups_name_unique', 'UNIQUE');

throttleテーブル(よくわからない)

users_groupsテーブル(ユーザがどのグループに入っているのか示すテーブル)

ここまでで、テーブルの用意はできました。

あとはphp oil refine migrateをすれば完了です。

余談

idにunsignedが付いたほうがいいのですが、付いてくれないので付けた。
oil/classes/generate/migration/actions.php 70行目あたり

$have_id or $field_str = "\t\t\t'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),".PHP_EOL . $field_str;

これを

$have_id or $field_str = "\t\t\t'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),".PHP_EOL . $field_str;

こうですね。

面倒なのはSimpleAuthと同じだった・・・。そして2037年問題がある・・・。だけど使ってみる。

■追記
記事投稿後、約1日間ですがphp oil g migrationにてテーブルが作成出来なかったことを確認しました。って思ったらphp oil g modelの書き方とmigrationの書き方って違うんですね・・・。

 Posted by at 12:07 AM
1月 142013
 

FuelPHPのassetパスを変更する、追加する方法。

こんばんは。ファガイです。今日は、FuelPHPのassetクラスに関してです。

例えば、

public/
 assets/
  images/
   sample.png

と、このようにassets内のimagesフォルダ内を参照するとします。

この状態で、Asset::img(“sample.png”);を行うとsample.pngは読み込めません。普通ですね。
通常、Asset::imgはデフォルトでasset/img内を確認するからです。

それで、どうするかですが。3つ方法があります。

フルパスで突っ込む方法。

Asset::img('http://..../assets/images/sample.png');

これだと行けます。

Asset::add_pathでパスを指定する方法。

Asset::add_path('assets/images/');
Asset::img('sample.png');

これでも行けます。

config/asset.phpの設定を変更する方法。

まず、core/config/asset.phpをapppath/config/asset.phpにコピーします。コピーせず、ファイルをつくってもいいです。

変えるべきは、foldersの項目です。

'folders' => array(
    'css' => array(),
    'js'  => array(),
    'img' => array('assets/images/'),
),

この様に、パスを追加すれば良いです。
これは、cssやjsも共通です。

以上です。ではでは。

 Posted by at 10:49 PM
1月 022013
 

あけましておめでとうございます。ファガイです。
今年もよろしくお願いします。

本日は、ちょっとしたミスで私のサイト「fagai.net」が動かなくなった話を。

先日まで、動いていたのですが、今日fagai.netを確認してみると、エラー。

Fatal error: Uncaught exception 'Fuel\Core\PhpErrorException' with message 'mkdir():略

皆さん気づいてるかもですが、権限の関係でした。
2013年になったため、logsフォルダ内に2013年のフォルダを作ろうとFuelPHPが動いたわけですが、権限が無かったためフォルダが作れなかったわけです。

とりあえず、logsフォルダの権限を下げたらしっかり動いてくれました。
このような軽いことで動かなくなる可能性があることを実感しました。環境構築や、コーディングには気をつけなきゃいけないですね。

ではでは。

 Posted by at 9:06 PM
12月 252012
 

こんばんは。ファガイです。

本日は、ちょっとした話だけ。
例えば、沢山のフィールドを編集する時。
保存しますよね。

例えばプロフィールテーブル。(簡易化してます。)

$profile = Model_Profile::find(1);
$profile_form = Fieldset::forge('profile_form');
$profile_form->add_model($profile);

if($profile_form->validation()->run()){
    $fields = $profile_form->validated();

    $profile->name = $fields['name'];
    $profile->age = $fields['age'];
    ・・・

    $profile->save();
}

まあ、こんな感じにしますよね。
どうやら、setメソッドがあるようで。というか俺が記憶してなかっただけかもしれない。

で、

$profile->name = ''

とかするのがめんどいので、こうする。

$profile = Model_Profile::find(1);
$profile_form = Fieldset::forge('profile_form');
$profile_form->add_model($profile);

if($profile_form->validation()->run()){
    $field = $profile_form->validated();

    foreach($fields ad $key => $value)
    {
        $profile->set($key, $value);
    }

    $profile->save();
}

こうすれば良かったことに気づいた。
それだけです。

 Posted by at 12:24 AM