FuelPHP 1.6 で OrmAuth 使って oil generate admin... でログインでコケる問題に暫定対処する

まだ未完成。
とりあえず、自分用にメモです。

## FuelPHP 1.6 で Ormauth 使って oil generate admin... でログインでコケる問題に暫定対処

FuelPHP 1.6 がリリースされてます。
OrmAuthが使える様になったとのことなので使ってみます。

oil g admin ...すると生成されるファイルはSimpleauth用っぽいので、OrmAuthを使ってかつ、出来るだけ oil で何とかしたい場合は、ちょっとだけ変更してやつ必要があるっぽいです。

### OrmAuthを導入

- まず、PKGPATH/auth/config/auth.php を APPPATH/config/auth.php にコピー

- driver を Ormauth に変更

```APPPATH/config/auth.php
<?php
return array(
	'driver' => 'Ormauth',
	'verify_multiple_logins' => false,
	'salt' => 'put_your_salt_here',
	'iterations' => 10000,
);
``` 

※必要に応じて PKGPATH/auth/config/ormauth.php もコピーして編集したらいいと思う。

## 必要なテーブルを作成する

- oil r migrate --packages=auth で必要なテーブルを作成する。

``` 
$ oil r migrate --packages=auth
``` 

これで、必要なテーブルがわんさか出来上がるはず。
※これを実行すると、PKGPATH/auth/migrations/*.php を実行してくれるみたい。

## 管理者ページを作ってみる

- 試しに oil g admin... で管理者用ページなものを作ってみる

```
oil g admin memo name:string
```

```
oil r migrate
```

これで、/admin/memo にアクセスできるはず。
ログイン画面が表示されてる。

この時、DBのusersテーブルをみてみると、usernameが「guest」のレコードと「admin」のレコードがある。

- adminが管理者っぽいので、ログインしてみる。

admin/admin でログイン出来るっぽい。
以下のファイルの93行目辺りに書いてある。

```PKGPATH/auth/migrations/005_auth_create_authdefaults.php
<?php
// (略)
				\Auth::instance()->create_user('admin', 'admin', 'admin@example.org', $group_id_admin, array('fullname' => 'System administrator'));
```


## APPPATH/classes/controller/admin.php にて、Model_Userが無いよとエラーになるので、PKGPATH/auth/model/auth/user.php を使うように修正する

※最初はModel_Userを自作したらいいね！って書いてたけど、どうやら、packageに入ってる奴を使ったほうが良い気がする。

```APPPATH/classes/controller/admin.php
                    $current_user = Auth\Model\Auth_User::find_by_username(Auth::get_screen_name());
```

あと、APPPATH/classes/controller/base.php にも Model_User が使われてるので、こっちも直しておく。
10行目くらい。

```APPPATH/classes/controller/base.php
<?php
// (略)
		$this->current_user = Auth::check() ? Auth\Model\Auth_User::find_by_username(Auth::get_screen_name()) : null;
```

## グループ関連のエラーが出る。ので、対応。

Model_Userも作ってログインしてみる。

が、やっぱりエラー。

```
Fuel\Core\PhpErrorException [ Notice ]: Object of class Auth\Model\Auth_Group could not be converted to int

PKGPATH/auth/classes/auth/group/ormgroup.php @ line 90
```

上記のようなエラーが出る。

どうやら、グループ関連でダメらしい。

- APPPATH/classes/controller/admin.php をそれっぽく修正してみる。

 15行目辺り。

```APPPATH/classes/controller/admin.php
<?php
// (略)
				if ( ! Auth::member(6))
```

こんな感じ。突然の「6」。

oil r migrate --packages=auth にて作成された users テーブルをみてみると、 group_id 列がある。

この値を設定してみた。

ら、エラー無くログイン出来た。

でも、なんだか色々とダメな感じがする。

- 突然の6とか、

- そもそも oil g admin の方を作成するアプリに対して最適な書き方に…とか、

- と言っても、認証処理しかせんしなぁーとか。

どうやって対処するのが一番良いのか後でちゃんと考えてみる。(考えないかも知れんけど。)

## Ormauthの恩恵を少しだけ考える

``` 
$ oil r migrate --packages=auth
``` 

により、以下のテーブルができてる。
各々の使い方は、まだちゃんと分かってない。

> users
> users_groups
> users_group_permissions
> users_group_roles
> users_metadata
> users_permissions
> users_roles
> users_role_permissions
> users_user_permissions
> users_user_roles

とりあえず、 users_metadata だけは key,value を保存したい人向けってのはわかる。

なので、Ormauthっぽい参考例を一つ書いてみる。
と、言っても全然役に立たん気がするけど…

認証済みの前提で、以下のようにすると、users_metadata にkey==hoge, value==fugaなレコードが保存される。

```APPPATH/classes/admin/hoge.php
                $current_user->metadata[] = Auth\Model\Auth_Metadata::forge(array(
                    'parent_id' => $current_user->id,
                    'key' => 'hoge',
                    'value' => 'fuga',
                ));
                $current_user->save();
```

Simpleauthの時の $data = unserialize($this->profile_fields); みたいなのが要らない。
保存も楽。

当たり前すぎやけど…