PHPのRuby on Railsクローンのフレームワーク Akelos PHPをいじってみた出来事のメモ。

Akelosをいじってみるメモ帳

Akelos PHP Blogチュートリアル一覧(全18記事)
Akelos PHP ユーザ認証チュートリアル一覧(全19記事)

2008年09月02日

Akelosユーザ認証チュートリアル 12.Accountコントローラ 管理者アクション実装

続いて管理者向けの各アクションの実装をします。
これはscaffoldが自動で作ってくれたコードがかなり使えますが、重要なのは管理者権限を持っているかの確認です。ApplicationControllerに実際の管理者権限確認は入れるため、こっちではちょっとだけコードを足すだけです。

管理者向けのアクションlisting、show、add、edit、destroyそれぞれのメソッドの最初に以下のコードを加えます。

//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);
//管理者か確認
if(!empty($_SESSION['user']) && empty($u->is_admin)){
$this->redirectTo(array('action'=>'login'));
return;
}


合計5回コピー&ペーストすれば終わりですね、簡単すぎる。scaffoldすばらしー。
ちなみに同じコードが複数出るので、個別の内部関数にすべきかもしれませんが、まぁ今回はめんどくさいので、このままで。


以上で、Accountコントローラの実装は終了です。

念のため追記にコードを全部再掲します。
確認したい人はどうぞ<?php

class AccountController extends ApplicationController
{
var $models = 'user';

function __construct()
{
// beforeFilterで、自動的にApplicationControllerの_authpageメソッドを呼ぶように指定。
//ただし、delete,logout,editのみが呼び出し対象として指定
$this->beforeFilter(array('_authpage'=>array('only'=>array('delete','logout','modify','add','listing','show','edit','destroy'))));
}

function index()
{
// 今回はindexアクションを使うのでリダイレクト無し。よってコメントアウト
// $this->performAction('listing')
$_SESSION['return_page'] ='';

//ユーザ情報を書き戻す
$u = empty($_SESSION['user']) ? false : unserialize($_SESSION['user']);
if(!empty($u)){
$this->user =& $u;
}
}

//登録アクション
function regist()
{
//scaffoldが作ったaddアクションからコピー&ペーストで楽に
if(!empty($this->params['user'])){
$this->User->setAttributes($this->params['user']);
if ($this->Request->isPost() && $this->User->save()){
//ここまでは標準状態のaddアクションと同じ。以下、regist用

////ここにはメールの送信処理を後でいれます
///詳細はメール機能のところで

//保存が成功した場合、認証をかける
//さらにセッションにUserモデルクラスをシリアライズして保存
//ログイン状態の維持を行う。

$_SESSION['user'] = serialize($this->User->auth($this->User->email,$this->User->passwd_confirmation));
$this->flash['notice'] = $this->t('account regist success!');
//welcomeメッセージに移動する。

$this->redirectTo(array('action' => 'welcome'));
}else{
//エラーメッセージを足しておきましょう
$this->flash['notice'] = $this->t('Error!! sorry not registed.');
}
}
}

//ログインアクション
function login()
{
if($this->Request->isPost()) {
//ログイン処理を行う。
//認証をかけて、さらにセッションに保存を行う。
$u = $this->User->auth($this->params['user']['email'] , $this->params['user']['passwd']);
if(!empty($u))
{
$_SESSION['user'] = serialize($u);
$this->flash['notice'] = $this->t('login is success');
//保存してあるログイン前の画面に戻るため
//ApplicationControllerのredirectToStoredPage関数に飛ぶ
$this->redirectToStoredPage();
} else {
$_SESSION['user'] = '';
$this->flash['notice'] = $this->t('login failed');
$this->redirectTo(array('action' => 'login'));
}
}
}

//ログアウトアクション
function logout ()
{
//セッションの情報を破棄
$_SESSION['user'] = false;
$this->flash['notice'] = $this->t('success logout');
//ログイン画面に移動
$this->redirectTo(array('action' => 'login'));
}

//ユーザ登録情報修正
function modify()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);

if(!empty($u->id) && !empty($this->params['user'])){
$this->user =& $this->User->find($u->id);
}else{
$this->user = $u;
$this->user->set('passwd','');
}
//入力された情報で更新を行う
if(!empty($this->params['user'])){
$this->user->setAttributes($this->params['user']);
if($this->Request->isPost() && $this->user->save() ){
$_SESSION['user'] = serialize($this->user);
$this->flash['notice'] = $this->t('updated user profile');
$this->redirectTo(array('action' => 'modify'));
}
}
}

function delete()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);

if(!empty($u->id) && $this->Request->isPost()){
//is_enableフラグをfalseで上書き
$this->user = $this->User->find($u->id);

if($this->user->updateAttribute('is_enable',false)){
$this->flash['notice'] = $this->t('deleted user account');
$this->redirectTo(array('action' => 'index'));
}
}

}

//パスワード忘れのパスワード再送
function remind ()
{
//セッションを念のため破棄(ユーザ情報不一致が発生するため)
$_SESSION['user'] = false;
if($this->Request->isPost()) {
//ユーザモデルクラスを新たに作る
$u = new User();
//emailアドレスが一致するユーザの情報を探し、Userクラス$uに入れる
$u = & $u->findFirstBy('email AND is_enable', $this->params['user']['email'],true);

//一致するメールアドレスが見つかったかどうかを判断
if( !empty($u->email) ) {
//ユーザモデルに新しいパスワードの発行と更新を依頼
$new_passwd = $u->new_password();
////ここにはメールの送信処理を後でいれます
///詳細はメール機能のところで
Ak::import_mailer('notifymail');
$m = new Notifymail();
$m->deliver('remindpassword',$u);

$this->flash['notice'] = $this->t('succeeded in the email send of new password.');
$this->redirectTo(array('action'=>'login'));
}else{
$this->flash['notice'] = $this->t('Error! Sorry,plese retry email remind...');
$this->redirectTo(array('action'=>'remind'));
}


}
}

function welcome()
{
}

function listing()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);
//管理者か確認
if(!empty($_SESSION['user']) && empty($u->is_admin)){
$this->redirectTo(array('action'=>'login'));
return;
}

//以下scaffold生成コードそのまま
$this->user_pages = $this->pagination_helper->getPaginator($this->User, array('items_per_page' => 10));
$this->users = $this->User->find('all', $this->pagination_helper->getFindOptions($this->User));
}

function show()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);
//管理者か確認
if(!empty($_SESSION['user']) && empty($u->is_admin)){
$this->redirectTo(array('action'=>'login'));
return;
}

//以下scaffold生成コードそのまま
$this->user = $this->User->find(@$this->params['id']);
}

function add()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);
//管理者か確認
if(!empty($_SESSION['user']) && empty($u->is_admin)){
$this->redirectTo(array('action'=>'login'));
return;
}
//以下scaffold生成コードそのまま
if(!empty($this->params['user'])){
$this->User->setAttributes($this->params['user']);
if ($this->Request->isPost() && $this->User->save()){
$this->flash['notice'] = $this->t('User was successfully created.');
$this->redirectTo(array('action' => 'show', 'id' => $this->User->getId()));
}
}
}

function edit()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);
//管理者か確認
if(!empty($_SESSION['user']) && empty($u->is_admin)){
$this->redirectTo(array('action'=>'login'));
return;
}

//以下scaffold生成コードそのまま
if(!empty($this->params['id'])){
if(empty($this->user->id) || $this->user->id != $this->params['id']){
$this->user =& $this->User->find($this->params['id']);
}
}else{
$this->redirectToAction('listing');
}

if(!empty($this->params['user'])){
$this->user->setAttributes($this->params['user']);
if($this->Request->isPost() && $this->user->save()){
$this->flash['notice'] = $this->t('User was successfully updated.');
$this->redirectTo(array('action' => 'show', 'id' => $this->user->getId()));
}
}
}

function destroy()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);
//管理者か確認
if(!empty($_SESSION['user']) && empty($u->is_admin)){
$this->redirectTo(array('action'=>'login'));
return;
}

//以下scaffold生成コードそのまま
if(!empty($this->params['id'])){
$this->user =& $this->User->find($this->params['id']);
if($this->Request->isPost()){
$this->user->destroy();
$this->redirectTo(array('action' => 'listing'));
}
}
}
}

?>
posted by AMUAMU at 21:54| Comment(0) | TrackBack(0) | チュートリアル | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。