GROUPエンジニアブログです。~認証とともに~こんにちは、底辺プログラマの高橋です。今回で最後になりますが、Symfony2でデータベースを利用した場合のユーザ認証の実装について触れていきたいと思います。(6)認証設定(doctrine利用の認証の場合)「Symfony2のススメ1」(5)の記述から「encoders」と「providers」の項目を変更します。「chain_provider」を指定する事で前回の設定を行った「user」アカウントでの設定を有効にしつつ追加設定を行っています。もこの認証機能のすぐれた点となります。username(7)エンティティクラスの作成symfony1系だと「lib/model」の下にモデルクラスが作成されていましたが、Symfony2系はバンドルディレクトリの「Entity」下に作成する事になると思います。(※1)設定ファイルからのクラスの自動生成も可能ですが、今回は手動で以下のファイルを作成します。}}コマンドを実行するとコメントの定義を元にセッター/ゲッターメソッドを「User.php」に自動生成してくれます。コメントの「@orm~」の部分がデータベースの定義の記述となります。AcmeSecurityBundle:User下記コマンドでコメントの定義を元にデータベースにテーブルを作成します。--forceユーザ管理に利用するテーブルのエンティティクラスは「UserInterface」をimplementsする必要があります。そのため、Interfaceに定義されている下記メソッドを実装しています。同じユーザであるとの判定処理(8)レポジトリクラスの作成Symfony1系では「lib/model」の下に自動生成されていた「XXXXTable.class.php」(doctrineの場合)「XXXXXPeer.php」(Propelの場合)と同じような用途のクラスとなります。(※1)このクラスも自分で作成する必要があります。}}「UserProviderInterface」をimplementsする必要があるので、その実装をしています。以上でユーザ認証する処理の実装は完了となります。ユーザを作成する処理の実装については割愛します。エンティティとリポジトリについてエンティティ/リポジトリという用語が登場しますが、このフレーズそのものはPofEAAやDDDで使用されているパターン名になります。自分の理解だと(怪しいですがw)下のような意味を持つようです。エンティティは同一性をもったオブジェクトで、同一性とは5歳の自分と20歳の自分は属性情報が異なるが同一性を持っておりエンティティとなる。逆に同じ属性情報をもっていても同一性がないと値オブジェクトとなる。リポジトリはオブジェクトにアクセスするため手段で、データへのアクセス手段をカプセル化してドメイン-モデルレイヤ間の明確な分離を行う。DDDのエッセンス:http://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/chap2.htmlRepository(PofEAA):http://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?Repository今回実装した認証処理は自分が確認した時点では、リリースされたばかりのせいか本家のドキュメントを眺めても纏まっておらずグーグル先生に尋ねたり、ソースを見るなど少しがんばる必要がありました。ユーザ会の方々がドキュメントを翻訳されてますし、今後も利用ケースが増えてくれば情報は充実していくと思います。php5.3を利用する要件の場合、選択肢の一つになってくると思いますので機会があったら一度試してみてはいかがでしょうか?また最後になりますが、下書き段階の文章にご感想いただいた@brtriverさんありがとうございました!ecnavi_tech2011年09月22日13:48カテゴリsecurity『アプリケーションハンガリアン...改善してみた』のエントリが「わかりやすくなってなさすぎるw」と指摘いただいたので補足します。前回のエントリ:アプリケーションハンガリアンを用いて徳丸本の「様々な列でのソート」のサンプルを改善してみた。読んだ方から「わかりやすくなってなさすぎるw」という指摘をいただいたので補足します。意図は伝わったけどs/usというprefixは一般的じゃないからパッと見てsafe/unsafeだと分からなかった。unsafeの略とか分からなかった。Joelのエントリ読んでやっと理解した。参考としてJoelのエントリ:間違ったコードは間違って見えるようにするへのリンクを記載するのではなく、まずこっち読んでねとしたほうが良かったかもですね。伝えたかったことは、前回のエントリの繰り返しになりますが、外部から渡ってきた値を文字列連結でSQLに組み込んでいるのは臭うということです。$sort_key;}その臭いを消すために外部から渡ってきた値はunsafeとし、safeに変換してから使うようにしました。これにより安全であることを分かりやすくしたつもりです。safeなprefixを持つ変数を連結Joelは「どこか1行のコードでその間違いを見つけられる」ことが利点だと言っています。$_GET['name'];これは正しい。$us;これは正しい。$us;これは間違っている。$_GET['name'];これは間違っている。SFromUS($us);これは正しい。$_GET['name'];これは間違っている。$usName;これは間違っている。$sName;これは正しい。前回のエントリでは上記3行より関数の定義が先に記載されているのも分かりにくい原因だったかもしれません。今回の議論で理解が深まった人がいれば幸いです。今後もどこかの誰かに役に立つかもしれないことや、どこかの誰かが面白いと感じてくれるようなことを発信していきたいと思いますので、どうぞよろしくお願いします。ecnavi_tech2011年09月20日10:01カテゴリsecurity勉強会アプリケーションハンガリアンを用いて徳丸本の「様々な列でのソート」のサンプルを改善してみた。こんにちはCTOの小賀(@makoga)です。今回はアプリケーションハンガリアンを用いて徳丸本のサンプルコードを改善してみます。--------------------------------------------------2011/9/22に補足エントリ書きました。『アプリケーションハンガリアン...改善してみた』のエントリが「わかりやすくなってなさすぎるw」と指摘いただいたので補足します。基本的にSQL文を動的に組み立てない。やらない方向で考える。しても動的に組み立てたいときは、外から渡ってきた値は安全ではないので直接使わない。安全な値とそうでない値はアプリケーションハンガリアンを用いて可読性を高める。脆弱性が生まれる原理と対策の実践の勉強会が3つ進行中です。SQL呼び出しに伴う脆弱性の様々な列でのソート」のサンプルコードをもう少し改善できるよねという話になりました。$sort_key;}上記が136ページに記載されているサンプルコードですが、以下のような改善点があると思います。GETで渡された値をSQL文に連結しているので、パッと見てこのコードが安全か分かりにくい。そこでアプリケーションハンガリアンを用いて以下のように改善しました。$sSortKey;これにより安全な値を連結していることが分かりやすくなったと思います。参考:間違ったコードは間違って見えるようにするecnavi_tech2011年09月16日13:03カテゴリRネタRを使ってお絵描き(アンパンマン方程式)こんにちは、ECナビの水越(@Akiyah)です。Rでお絵描きの完結編です。アンパンマン方程式というものを作ってみました。この方程式を解くと、こうなります。アン、アン、アンパンマーン!Rのコードはこんな感じです。color=col)方程式の正体は、楕円の方程式の組み合わせです。眉毛と口の式を工夫して、うまく楕円の半分になるようにしました。前の二回のアンパンマンは眉毛がかけなくて悔しかったのですが、やっと完璧なアンパンマンにすることができましたよ。:rrglアンパンマン方程式ecnavi_tech2011年09月16日09:22カテゴリTreasure2011終了!!こんにちは。システム本部の浪川です。8月15日(月)からスタートしたECナビの夏のもの創り実践プログラム【Treasure】が終了しました。私は前半の講義で講師として参加させていただきました。自分のことの様に緊張しながら見守った中間発表(緊張で発表中トイレに5回以上行っていたのは内緒です。)始めのころはDBやPHPでひっかかっていた学生たちが後半にはバリバリ開発しているのを見て「どんだけ成長してんだよ!」って思ったグループワークそして、涙あり?笑いありの最終発表と1ヶ月間があっという間に過ぎてしまいました。私も大勢の前で講義をするのは初めてだったのでとても良い経験ができ成長できたと思います。参加したみなさんにも「大変だったけど良い経験だったし、成長できた。」と思っていただけていたらなによりです。最後に講義資料のチェックやインフラ整備をしてくれたシステム本部のみなさん。さまざまなところでフォローしてくれた人事のみなさん。サポーターをしていただいたエンジニアのみなさん。TAをやってくれた来年の内定者。参加してくれたみなさん。みなさんのおかげで今年のTreasureも無事終えることができました。本当にありがとうございました。