2011年4月8日金曜日

4/8覚書

1時間目
CSS適用ができねえええええ。
とおもったら。
ln -s ../css css
自分のログで大文字で書いてた(テペペロ☆

2時間目
comment_listで
コメントと名前とカテゴリの編集をできるようにする。ヒントはreply_add。
exで画像のようだがそこまではムリポ。

3時間目
☆symfonyのアクセス制御
管理画面、マイページなどのように認証されたユーザで
特定の権限を持つユーザだけが閲覧や操作を行えるようにする。

/bbs2/lib/model/MemberPeer.php
static public function retrieveByPassword($mailaddress,$password) {
  $c = new Criteria();
  $c->add(self::MAILADDRESS, $mailaddress);
  $c->add(self::PASSWORD, $password);
  return self::doSelectOne($c);
 }

4時間目
☆認証
symfonyは、アクセスしているユーザに関する情報はユーザークラス($this->getUser())が持っている。
ユーザクラスに権限の情報を付与・削除することと、各アプリケーションごと、
モジュールごとのsecurity.ymlでアクセス制御を実現する。

認証済みかどうか $this->getUser()->isAuthenticated();
どの権限を持つかどうか $this->getUser()->hasCredential("member");

この二つを主に利用する。

制限のルールを書くのはsecurity.ymlで行う。
/backend/config/security.ymlに以下のように記述
all:
  is_secure: on #認証済みの必要がある
  credentials: [ member ] #必要な権限を設定する
モジュールにもsecurity.ymlを置いて上記のように記述することでモジュールごとの
権限管理を行うこともできる。
あと複数設けることもできるが、orにしたい場合は
credentials: [[member,admin]]のようになる。

backendにlogoutモジュール作成して
ログアウト処理。backendからアウトしてTOPへ。
action側(しか要らない)
public function executeIndex()
  {
 //未認証にする
   $this->getUser()->setAuthenticated(false);
 //権限をクリア
 $this->getUser()->clearCredentials();
 //TOPへ移動
 $this->redirect('http://www.shonanbbs.com'');
   return sfView::SUCCESS;
  }
ログイン処理→ログインできたらログアウト→defaultへ遷移。
ログイン処理+α TOPからのリンク。をやりました。まとめソース↓

5時間目

admin_ynカラム追加してif文で判定。

$this->getUser()->setAttribute('member_id', $member->getId(),sfConfig::get('sf_session_name'));
第3引数はセッション内に名前空間(name_space)を必ず設定。
区切りでセットすることで区切りごと削除が可能となる。
sesstion_nameはプロジェクト直下のconfigのsetting.ymlに記述。

☆練習問題
mypageアプリケーション作成
権限Credentialはmemberを指定
adminとmemberでログインしたあとの遷移を変更。
てか最終的な情報しか残せなかたよ。ごめんよー。
frontのloginモジュール、action側
public function executeIndex()
        {
                $this->mailaddress = $this->getRequestParameter('mailaddress');
                $this->password = $this->getRequestParameter('password');

                if ($this->mailaddress != '' && $this->password != '') {
  //メンバーテーブルに入力されたメールアドレス、パスワードで
  //指定出来る行があるかどうか
  //MemberPeerに$this->mailaddress, $this->passwordの引数を渡す
                 $member = MemberPeer::retrieveByPassword
                 ($this->mailaddress, $this->password);

                 if ($member){

  // ログイン状態にする
  //認証処理は$this->getUser()で受け取れるuserオブジェクトで
  //設定できる。セッション名をいちいち変えなくていい。
  $this->getUser()->setAuthenticated(true);

  //権限をクリア
  $this->getUser()->clearCredentials();
  // 会員情報をセッションにセット
  $this->getUser()->setAttribute('member_id',
  $member->getId(),sfConfig::get('sf_session_name'));
  $this->getUser()->setAttribute('nickname',
  $member->getNickname(), sfConfig::get('sf_session_name'));

   if($member->getAdminYn() == 'y') {

   //admin権限付与
   $this->getUser()->addCredential('admin');
   $this->redirect('/backend');

  }elseif ($member->getAdminYn() == 'n') {

   //ここでは一般会員権限のみ付与
   $this->getUser()->addCredential('member');

   // 会員情報をセッションにセット
   $this->getUser()->setAttribute('member_id',
   $member->getId(),sfConfig::get('sf_session_name'));
   $this->getUser()->setAttribute('nickname',
   $member->getNickname(), sfConfig::get('sf_session_name'));

   $this->redirect('/mypage');
   }
  }
   $this->errormsg = "あてはまるユーザが登録されていません";
 }
                return sfView::SUCCESS;
        }

frontのloginモジュール、index側

<?php slot('pankuzu');?>HOME<?php end_slot();?>

<?php slot('title');?>
TOP
<?php end_slot();?>

<?php slot('sidemenu');?>
<?php include_partial("global/menu", array('now' => 'login'));?>
<?php end_slot();?>

<?php use_helper('Validation') ?>

<?php echo form_tag('login/index');?>
<div class="tblData">

<?php if ($errormsg != ''):?>
<div><?php echo $errormsg;?></div>
<?php endif;?>

<table>
        <tr>
                <th>メールアドレス</th>

                <td
                <?php if ($sf_request->haserror('mailaddress')) :?>
                 style="background-color:#ffcccc;"
                 <?php endif;?>>

                 <?php echo input_tag('mailaddress', $mailaddress, array('size' => 50));?>
                <?php echo form_error('mailaddress');?></td>
        </tr>
        <tr>
                <th>パスワード</th>
                <td><?php echo input_tag('password', $password, array('size' => 50));?>
                <?php echo form_error('password');?></td>
        </tr>
</table>
</div>
                <?php echo submit_tag('ログインする');?>
</form>

mypageログイン時TOP表示。
mypageのsecurity.yml
default:
  is_secure: on
  credentials: [ member ]

action側
public function executeIndex()
  {
   $this->getUser() -> getAttribute('member_id',
NULL,sfConfig::get('sf_session_name'));

 $this->member = MemberPeer::retrieveByPK($member_id);
 //$this->comments = CommentPeer::retrieveByComment_Id($cooment_id)
 return sfView::SUCCESS;
  }

mypageのindex。
<?php slot('title');?>
MYPAGE
<?php end_slot();?>

<?php slot('sidemenu');?>
<?php include_partial("global/menu", array('now' => 'member_add'));?>
<?php end_slot();?>

mypageのaction。
public function executeIndex()
  {
   $this->getUser() -> getAttribute('member_id',
NULL,sfConfig::get('sf_session_name'));

 $this->member = MemberPeer::retrieveByPK($member_id);
 //$this->comments = CommentPeer::retrieveByComment_Id($cooment_id)
 return sfView::SUCCESS;
  }
奇跡といいたい。
でけた。

ていうか現状ではlogoutがbackendしかないからmypageでログアウトするのって
ログインしなおすんだよね・・・・・・権限で判定??

補足設定
backendのsettings.ymlを下記に変更。

#認証できない時はloginページに遷移
    login_module:           default   # To be called when a non-authenticated user
    login_action:           login     # Tries to access a secure page
#管理者権限が無い場合はエラー表示
    secure_module:          default   # To be called when a user doesn't have
    secure_action:          secure    # The credentials required for an action
sessionの有効期限はsettings.ymlの95行目
# timeout: 1800 # Session timeout, in seconds
だよー。

来週は自分のプロフィールや投稿のみ編集可能にする。
とバリデートするそーな。

自分的お勧め
PHPエラーの意味を教えてくれるところ