2011/04/08

symfonyで掲示板作成、セキュリティ、権限

php講習 4/8

・今日は天気が悪いけど、まだ雨は降ってません。


1時間目
・昨日の課題を自習
・1時間以上かけて色々試したり、Webを検索したが、ルーティング情報は
反映されている。しかし、URLの表示は直らない。


2時間目
・投稿(コメント)一覧、戻るリンクを設定
・投稿編集、更新完了画面で、戻るリンクを設定

・写真の表示は対応、編集は未対応

・返信一覧のモジュール作成
$ symfony init-module front reply_list
・アクセス確認
/front_dev.php/reply_list/index

・返信一覧の画面設定追加(default/indexからコピー)
パンくずリスト追加

・コメント一覧に、返信数を表示する。
コメント一覧から、返信一覧にリンクを作成
・コメント一覧、コメント編集のパンくずリスト修正

・(メンバ登録、パンくずリストなし)フロントは使わない。


3時間目
・アクセス制御(ログイン画面)
  セッションでlogin_ynの判断

・front-appにloginモジュールを作成
$ symfony init-module front login
/loginでアクセス出来るようにする。

・メールアドレス、パスワードを受け取るログインフォームを作成
昨日の練習はこれを問題なく作るためだったんでしょうか。
・ログインフォームの飛び先は自分で、受け取ったパラメータ から、
メンバテーブルを読みメンバがいるか確認する。
・メンバテーブルを読む処理は、アクションに記述せず、関数にして
MemberPeerに記述する。
ログインしたメンバの名前を表示して確認する。

・メールアドレス、パスワードをチェックするとき、SQL文(チェック関数)は
memberPeerに関数として定義する。


4時間目
・権限
権限は追加できる
(「,」区切りで[[]]で複数指定できるが今回は使わない。)
・設定前の画面確認
/backend/member_list
・権限の制限設定(モジュール毎の制御では、/mod-id/config/security.yml)
  backend/config/security.ymlの設定
default:
  is_secure: off   -> on
  credentials: [member]
設定したら、symfony ccを忘れずに。
・確認(バックエンド以下がsecureになった)
/backend/member_list
    →ログインせず直接アクセスでエラー
 Login Required
This page is not public.


・ログイン画面で認証できたら、バックエンドに飛ばす処理を追加。
$this->redirect('/backend') ;

セキュリティとしてsymfonyのUserオブジェクトに設定するもの
Authenticated = 認証
Credential    = 権限

securiry.ymlで設定する項目
is_secure = 認証
credentials = 権限

・権限の関数は、通常使うものはテキストにあるものくらい。

<課題> ログイン確認できたら、ログアウト機能を追加
・まず、ログアウトモジュール作成
$ symfony init-module backend logout

・次に、サイドメニューにログアウトを追加、リンク先をログアウトモジュールにする。
(ログアウトしたあとはとりあえず、ログイン画面にしておきました)
・バックエンド側のサイドメニューにログアウト項目追加、リンク先をlogoutにする。
ログアウトしたときは、認証と権限をクリアする。
・フロント側のサイドメニューにログイン項目追加、リンク先をloginにする
・確認
/login
/backend/backend_dev.php

settings.yml
#    login_module:           default   # To be called when a non-authenticated user
#    login_action:           login     # Tries to access a secure page
コメントを外す

5時間目
・バックエンドが表示されない
securty.ymlのadmin権限の書き方の問題だった。

<課題>ログイン処理が出来たので、backendは管理者の設定にする。
・管理者の判断のためメンバーテーブルにadmin_ynカラム追加 varchar(1)
> ALTER TABLE member ADD COLUMN admin_yn varchar(1) ;
> desc member;
$ symfony propel-build-schema
$ symfony propel-build-model
$ symfony cc

・ログインでadmin_yn="Y"ならバックエンドへ
  ログインの処理変更
・テストユーザ設定
> update member set admin_yn='Y';
> update member set admin_yn='n' where id=1;

・ログインユーザのセッションの値セット
ログインしたとき、よく使うデータを入れておく。
セッション内に名前空間を作る 第3引数
$this->getUser()->setAttribute('member_id',$member->getId(),sfConfig::get('sf_session_name'));
$this->getUser()->setAttribute('nickname',$member->getNickname(),sfConfig::get('sf_session_name'));

・ログアウトしたときに、名前空間ごと削除する

・パラメータの受け渡し確認のため、バックエンドのテンプレートにニックネームを表示する。

・ログインするとき
backend-app
権限 admin
credetail

mypage-appにとばす(ログイン画面と同じ)
権限  member
画面はトップページ(掲示板)

$ symfony init-app mypage
$ symfony init-module mypage default

6時間目
・答え合わせ
・mypageのアクセス確認は各自で実施する。アクセス出来ている前提。
(これって結構作業量ある)
・mypage-appのアクセス、/mypageになるように設定
$ cd web
$ mkdir mypage
$ mv my*php ./mypage/
$ cp .haccess ./mypage/
$ cd mypage
$ vi .htaccess
$ vi mypage.php
$ vi mypage_dev.php
$ ln -s /usr/share/pear/data/symfony/web/sf ./sf
$ ln -s ../css ./css
/config/setting.ymlの設定変更(リンクヘルパ用)
all:
    no_script_name:         on       # Enable the front controller name in generated URLs

・セキュリティ設定
security.ymlの設定変更
default:
  is_secure: on
  credentials:  [ member ]
・アクセス確認(エラーになる)
/mypage
Oops! An Error Occurred
The server returned a "500 Internal Server Error".

・バックエンド側の権限設定変更
backend
  credentials:  [ admin ]

<課題>mypage にログインユーザの情報を表示
・ログインのアクションで、情報をセット
$this->getUser()->setAttribute('member_id', $member->getId(),sfConfig::get('sf_session_name'));
$this->getUser()->setAttribute('nickname', $member->getNickname(), sfConfig::get('sf_session_name'));

・mypageのアクションで情報を取得、テンプレートで表示
$this->id = $this->getUser()->getAttribute('member_id', null,  sfConfig::get('sf_session_name')); 
$this->nickname = $this->getUser()->getAttribute('nickname', null, sfConfig::get('sf_session_name'));

・symfonyで残った機能
バリデート(エラーチェック)
応用、プラグイン
・あとは、習うより慣れろってことでしょうか
・いままで習った範囲の知識で出来ること
ユーザごとのコメント一覧
自分のコメントを削除

・symfonyの説明が終わったら、自由課題を2週間ほどやる予定。

0 件のコメント:

コメントを投稿