2012年12月14日金曜日

ユーザー認証にチャレンジ

複数回になりそうです。

まずは公式ドキュメントを確認。
http://fuelphp.com/docs/packages/auth/simpleauth/intro.html

当然英語です。。。
かなり適当に和訳。あっているかも怪しいですw。


Introduction
SimpleAuthはその名のとおり認証パッケージに含まれているシンプルな認証システムです。Authの動作、実装のサンプルであり、他の認証ドライバのサンプルでもあり、独自ドライバを作成するときの参考資料とすることができます。
Auth setup
設定は SimpleAuth ドライバを使用することを Auth package に伝えることから始まります。これは auth.php コンフィグファイルで設定します。デフォルトのファイルは Auth package にあります。変更を加える前にあなたの app/config フォルダにこのファイルをコピーしてください。デフォルトで SimpleAuth package用に設定されている。コンフィグファイルについての説明は 後のconfigrationを参照してください。
セットアップ完了後、app/config/config.php always_load 部分でパッケージのオートロードを行うかを選択できます。
Configuration
SimpleAuth認証システムはコンフィギュレーションファイルを使用して構成されます。'simpleauth'コンフィギュレーションファイルに驚くところはありません。デフォルトのファイルは、 Auth package にあります。変更を加える前に、app / configフォルダにこのファイルをコピーしてください。
The following configration values can be defined:
次の設定値を定義することができます:
Param
Type
Default
Description
db_connection
string
null
使用するDB接続名称。db.php ファイルの定義と一致させる必要があります。デフォルトはnull
table_name
string
'users'
使用するユーザーテーブルの名称
table_columns
array
array('*')
配列でユーザーテーブルから選択、またはすべてのカラム。最低でも username, password, email, last_logoin, login_hash, group, profile_fieldsは指定する必要がある。
guest_login
boolean
true
true なら誰もログインしていない場合、ダミーゲストユーザを作成することによりグループ、acl driversの使用を許可します。
groups
array
array()
SimpleAuth groups driver によるグループの定義。グループの配列詳細については*ここを参照してください。
roles
array
array()
SimpleAuth groups driver による role 定義。roles の配列詳細については*ここを参照してください。
login_hash_salt
string
'put_some_salt_in_here'
SimpleAuth ドライバでパスワードを安全に作成するためのソルト値はパスワードのハッシュ値を計算し、データベースへの格納に使われます。デフォルトパスワードは PBKDF2 ですが、ランダムな文字列にデフォルトを変更してください。
username_post_key
string
'username'
ログインフォームの username インプットフィールドの名称を指定します。
password_post_key
string
'password'
ログインフォームの password インプットフィールドの名称を指定します。

Database table
SimpleAuth はひとつのテーブルを使用します。作成にはこの SQL を使用してください。

CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`group` int(11) NOT NULL DEFAULT '1',
`email` varchar(255) NOT NULL,
`last_login` varchar(25) NOT NULL,
`login_hash` varchar(255) NOT NULL,
`profile_fields` text NOT NULL,
`created` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `useranem` (`username`, `email`)
)

Example
サンプルのログインアクション
public function action_login()
{
$data = array();

//送信ボタンを押したら
if (Input::post())
{
$auth = Auth::instance();
if($auth->login())
{
Response::redirect('success_page');
}
else
{
//Oops
$data['username'] = Input::post('username');
$data['login_error'] = 'Wrong username/password combo. Try again';
}
}

//Show the login form
echo View::forge('auth/login',$data);

}

次は訳文のとおりSQLでテーブルを作成してみることにします。
当然、前回妄想したusersテーブルとはテーブル設計が異なりますw。
>続く

2012年12月13日木曜日

作業工程を妄想する

前回投稿で一応DBのテーブルの骨子は考えたので、
今度は全体の工程を考えて(妄想)しておく。


機能面を中心に時系列でならべてみよう

  1. ユーザ認証機能をつける
  2. コメント機能をつける
  3. 予約状況の更新機能をつける
  4. 進捗管理用のビューをもうける。全体の進捗を俯瞰できるといいな。
こんな方針でいってみようと思う。
1と2についてはサンプルも見つけられると思うのでどうにかなりそう。
3はちょっと難しそうなので最後に。
予約状況の元となるreservationsテーブルに放り込むデータはcsvにする予定。
csvから放り込む部分もできれば半自動化したいと考えている。
csvデータをreservationsテーブルに放り込む部分と、reservationsテーブルのデータをarrivalsデータに統合する部分が今のところよくわからない。正直全体的によくわからないんだけど、特にわからないってことでw。

年末も近くなって作業時間の捻出も課題だ。
睡眠時間を削っての作業が基本だが、今は冬真っ盛りで寒い寒い。
防寒対策も講じねば。

>続く。

DB設計を考える

自身のスキルを考えたらDBや仕様はできるだけ簡単するというのが一つの解だとは思いながらも、つまずくポイントでしっかりつまずいていきたいという思いもあるため最初からゴールを意識して作成していくことにしてみる。 あまりにも遠回りになりそうならその時考えることにしよう。

まずはテーブルを思いつく限り。

  • users - 認証とセッション管理に使うつもり
  • arrivals - 顧客データに当たる部分。素直に顧客データとしないのは顧客に対する到来イベントを処理の中心に置きたいから。普通なら顧客テーブルに到来イベントテーブルをぶら下げるべきだけど、到来イベントをまとめたデータ群を定期的に作成してarrivalsに放り込んでいく。 あまりサンプルがみつからないアプローチの仕方なのでこの先つまずく原因になりそうな仕様だ。
  • comments - 顧客とのやりとりを記録していくテーブル。このシステムでの基幹となる部分かな。ここに残したコメントを複数人で共有できるようにするのが主目的
  • reservations - 予約情報をシステム外部から取り込んで放り込んでおくテーブル
妄想では、
arrivalsのデータに対してセールスアプローチを行い、アプローチのログをcommentsテーブルに記録していく。reservationsには定期的に結果を取り込みarrivalsに結果情報を補足する。
コメントを作成する機能のほか、外部情報をテーブルに反映させていく機能が必要だ。
顧客情報を扱うので当然認証機能はつけたい。
とはいえ、イントラ内での使用を前提としているので簡易認証でも構わないと思ってる。

ER図にするにはまだ妄想が足らない気がするので落書きから。
ああ、そうそう顧客の予約管理システムにしたいってのどっかに書いたっけか。

users

  1. id
  2. nameKana
  3. nameKanji
arrivals
  1. id
  2. 目的コード
  3. date
  4. address
  5. phone
  6. mobile
  7. stage
  8. reservation_id
comments
  1. id
  2. user_id
  3. arrivals_id
  4. date
  5. time
  6. text
  7. status

reservations
  1. id
  2. arrivals_id
  3. date
  4. staff
テーブルは4つくらいか。テーブル間をMySQL上で結ぶ必要はないはず。テーブル間の結びつけはFuelがやってくれる。。。はず。 そうだよね??

すこしやりたいことがはっきりしてきました?
目的コードは英語表現ではなんて書けば良いかなぁ。ちょっとweblioで調べておくか。
むぅ。なんとなくここにテーブル間の従属関係を考えればbakeでパパッといけるような気がするけどここはFuelPHPで頑張ってみることにしよう。

従属関係はアンダースコアで書いてみた。アンダースコアのついている項目は
他テーブルの主キーにするつもりです。
CakePHPと並行して学習中なので記法なんかがゴッチャになってますw。

作業の進み具合を分かり易くするために目次をつけてみることにする。


>>続く