VOYAGE GROUP エンジニアブログ

voyagegroup_techのブログ
VOYAGE GROUPエンジニアブログです。

2011年09月

Symfony2のススメ1.5 ~コンポーネントちょい話~

こんにちは、底辺プログラマの高橋です。
今回は「コンポーネント」と「Symfony2 Standard Edition」について簡単に触れます。

Symfony Component
Symfony2の各機能は Symfony Componentという単体でも利用可能なライブラリ群で構成されてます。

Symfony Component一覧 http://symfony.com/components

「Symfony2のススメ1」で簡単な認証機能の実装例を示しましたが、
認証機能はSecurityコンポーネントというライブラリを利用することで実装しています。
この認証機能はSymfony2だけに限らず単独の認証機能のライブラリとしても利用可能です。
(単独での利用は勉強不足で試せてないですが)
pearからのインストールも可能です。

$ sudo pear channel-discover pear.symfony.com
$ sudo pear remote-list -c symfony2
Channel symfony2 Available packages:
====================================
Package             Version
BrowserKit          2.0.0
ClassLoader         2.0.0
Config              2.0.0
Console             2.0.0
CssSelector         2.0.0
~略~
Symfony2 PEAR Channel http://symfony.com/blog/symfony2-pear-channel


Symfony2 Standard Editionについて


Symfony公式よりtarballをダウンロードすると「Symfony2 Standard Edition」を利用する事になります。
tarballの「Symfony2 Standard Edition」はコア機能+Doctione2等の外部ライブラリを纏めたファイルとなります。
しかし、gitレポジトリでは起動用ファイル/デモ機能/アプリケーションの殻の構成となっており、
gitからインストールしようとすると他レポジトリのインストール操作が必要になります。

$ git clone http://github.com/symfony/symfony-standard.git
$ cd symfony-standard
$ rm -rf .git
$ php bin/vendors install
Symfony2 Download:http://symfony.com/download
Symfony2 Standard Edition git レポジトリ:http://github.com/symfony/symfony-standard

「php bin/vendors install」では「deps」ファイルに記載されている各gitレポジトリを
「vender/」ディレクトリ下に展開しています。
ログ出力のようなコアに近い機能も「monolog」として独立したライブラリを利用してたりします。

depsファイルの中身
[symfony]
    git=http://github.com/symfony/symfony.git
    version=v2.0.0
[twig]
    git=http://github.com/fabpot/Twig.git
    version=v1.1.1
[monolog]
    git=http://github.com/Seldaek/monolog.git
    version=1.0.0
~略~

ちなみに「
Symfony Component」はhttps://github.com/symfony/symfony/tree/master/src/Symfony/Componentに存在してます。
以上、今回は機能の独立性が高い構造となってますね! という話でした。

カンファレンスで「事業創造に貢献する“最速最高”プロジェクト推進活動」という講演をしました

アジャイル戦略室 小芝です。
 
この春からアジャイル戦略室という組織を結成し、プロジェクトの円滑な進行と確実なリリースとを俊敏に行えるようになるための支援活動を繰り広げてきました。
その成果や気づきをまとめて、XP祭り2011というカンファレンスで講演してきました。

Slideshareで発表資料を公開しておりますので、是非ご覧下さい。

さて、発表資料という特性上、写真や端的な文言が多く、発表を聞いていない方には、この資料だけでは何がなんだかわからないかと思います。
もしお呼びいただければ再演いたしますので、ご興味の有る方は是非コンタクト下さい。

この事例が世の中に広くお役立てできるのなら、それはとってもうれしいな、って思っています。
また、わたしたちとしても、この事例を通じてECナビをもっと知ってもらいたいですし、フィードバックをいただき自分たちのやり方をブラッシュアップしたいと考えております。

お気軽にお声がけください。
  • 勉強会やカンファレンスなので直接お声がけいただく
  • @bash0C7 にmentionやダイレクトメッセージを送る
  • フォームからからコンタクトいただく

Symfony2のススメ1 ~認証とともに~

株式会社ECナビ傘下のPeXで底辺のプログラマをやってます。高橋と言います。
底辺の実力と引き出しの少なさから何を書こうか道に迷っていたのですが
7/28にPHP5.3対応のフレームワークであるSymfony2(※1)がリリースされたという事で
Symfony2のユーザ認証まわりと簡単なカスタマイズを触れていきたいと思います。

※1 Symfony2とは何ぞやという人は下記ページをご参考にしてください。
Symfony2 公式 http://symfony.com/
日本Symfonyユーザー会 http://docs.symfony.gr.jp/
Symfony2 ドキュメント日本語版 http://docs.symfony.gr.jp/symfony2/index.html

今回の環境
今回の記事を書くにあたって下記構成で動作確認を行いました。

CentOS release 5.6
PHP 5.3.6
mysql 5.5.11
Symfony Standard Edition 2.0.0

認証と認可
最初にSymfony2に限った事ではないのですが、認証と認可について簡単に知っとく必要があります。
Symfony2では認証を「Firewalls」、 認可を「Access Controls」で設定します。

認証とは
Aさん、Bさんである本人確認。
認可とは
Aさんはシステム権限なので「/admin」にアクセスできる、Bさんはユーザ権限なので「/user」にアクセスできるといった権限の確認。

auth

では、最初に簡単なフォーム認証を作成してみます。
今回はSymfony2のインストールと設定については省いて認証の設定だけ載せますが
フレームワークのルートディレクトリ以下の構成と修正を行なうファイルは下記となります。 

app/                                         # 設定、キャッシュ、ログなどアプリケーションのディレクトリ
 |-config/                               # アプリケーション全体の設定
    |- routing.yml # ルーティングの設定ファイル
    |- security.yml # セキュリティ機能の設定ファイル
src/ # ユーザが作成したコードを設置するディレクトリ
  |- Acme/SecurityBundle/ # 今回作成するログイン機能のバンドル
    |- Controller/SecurityController.php # コントローラ
    |- Resources/views/Security/login.html.twig # テンプレート
    |- Entity/User.php # ORMクラス
    |- Repository/UserRepository.php
vendor/ # 外部のソースを置くディレクトリ
web/ # ドキュメントルート 

(1)認証用バンドルを作成
Symfony2では「バンドル」を作成してその配下にコードを実装します。
バンドルの殻はコマンドを実行して作成します。
色々選択肢が出ますが今回はすべてデフォルトで問題ないです。 

$ php app/console generate:bundle --namespace=Acme/SecurityBundle
$ php app/console generate:bundle --namespace=Acme/SiteBundle 

(2)ルーティングの設定
ルーティングとはアクセスパスと対応するコントローラなどの設定になります。。
「login」は「Acme/SecurityBundleバンドル」の「Securityコントローラ」の「loginアクション」が動作する設定となります。
「logout」、「login_check」はルーティング設定を書くだけで、あとでSymfony2がよろしくやってくれます。
「user」は認証エリアのコンテンツという事で特に実装は行いません。
$ vi app/config/routing.yml
login:
    pattern:   /user/login
    defaults:  { _controller: AcmeSecurityBundle:Security:login }
login_check:
    pattern:   /user/login_check
logout:
    pattern:   /user/logout
user:
pattern:   /user/{name}
defaults: { _controller: AcmeSiteBundle:Default:index }

(3)コントローラを修正
コントローラではログイン処理は実装せずに、テンプレートへの値の引渡し処理のみを実装します。

$ vi src/Acme/SecurityBundle/Controller/SecurityController.php
<?php
namespace Acme\SecurityBundle\Controller;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
class SecurityController extends Controller
{
    public function loginAction()
    {
        $request = $this->getRequest();
        $session = $request->getSession();
        // get the login error if there is one
        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
        }
        return $this->render('AcmeSecurityBundle:Security:login.html.twig', array(
            'last_username' => $session->get(SecurityContext::LAST_USERNAME),
            'error'         => $error,
        ));
    }
}

(4)テンプレートの修正
Symfony2からTwig(※2)というテンプレートエンジンが採用されています。
ユーザネームとパスワードを入力するフォームを作成します。
(今までのようにphpのテンプレートで記述する事も可能です。)

$ vi src/Acme/SecurityBundle/Resources/views/Security/login.html.twig
{% if error %}
    <div>{{ error.message }}</div>
{% endif %}
<form action="{{ path('login_check') }}" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />
    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />
    <input type="submit" name="login" />
</form>

※2 Twigとは速くてセキュアで柔軟性の高い(と公式で主張されている)テンプレートエンジンです。
phpのテンプレートだとモダンなテンプレートエンジンでサポートされている機能がサポートされていないため導入した
と記載がありました。
個人的には「echo 」や「()」などを記述しなくて良い事で、わりかし見た目が簡潔になるのが良いと思ってます。
Twig公式 http://www.twig-project.org/
構文/設定 http://docs.symfony.gr.jp/symfony2/book/templating.html


(5)認証設定

認証の肝となる設定を行ないます。(※3)
今回は「/user」を認証エリア、その他は非認証エリアという設定にします。

「providers」「encoders」は認証方法などの項目で平文で設定ファイルのID/PASSで認証するように設定してます。
「firewalls」は認証を適用するエリア(URL)と認証しないエリアを設定しています。
「access_control」はパスに対するアクセス権限の設定しています。他にもアクセス元IPアドレスや接続プロトコル(https or http)などの設定が可能です。

$ vi app/config/security.yml
security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
    providers:
        in_memory:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
    firewalls:
        login:
            pattern:  ^/user/login$
            security: false
        secured_area:
            pattern:    ^/user
            form_login:
                check_path: /user/login_check
                login_path: /user/login
            logout:
                path:   /user/logout
                target: /user
    access_control:
        - { path: ^/user, roles: ROLE_USER}
※3 セキュリティ機能の設定について: http://symfony.com/doc/current/book/security.html

これで「/user」以下にアクセスしようとすると「/user/login」のログイン画面が表示されて認証が求められるようになり、「user/userpass」でログインできるようになります。
(やり方さえ知ってれば)簡単な気がしてきましたね!

記事検索
QRコード
QRコード