[CakePHP] シンプルな認証を実装する(認証の中盤)

[CakePHP] シンプルな認証を実装する(認証の前半) – Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/4855

なところでフォーム認証ができたので「こんにちは、○○さん」だけ作ってみる。
下記のように、ログイン状態を表示して login/logout へのリンクもつける。

□ログインしていない状態
20130504_01

□ログイン状態

20130504_02

こんな風に、ログイン状態とリンクを表示させる。

■AppController.php を変更する

class AppController extends Controller {

    public $components = array(
        'Session',
        'Auth' => array(
        	// ログイン後に /Posts/index へジャンプ
        	'loginRedirect' => array('controller' => 'posts', 'action' => 'index'),
        	// ログアウト後に /Pages/home へジャンプ
			'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'))
		);

    public function beforeFilter() {
    	// 各コントローラーの index と view を有効にする
        $this->Auth->allow('index', 'view');
        // 認証コンポーネントをViewで利用可能にしておく
        $this->set('auth',$this->Auth);
    }
}

*.ctp で直接表示することも考えたのだが、Controller 経由でないと Auth コンポーネントを扱えないので、VView で扱えるように AppController に $this->set(‘auth’, $this->Auth ); という形で View からも Auth を使えるようにしてしまう。スピード的にはどうなんだろう、と思うところもあるけれど、こうするとすべての view からログイン関係がアクセス可能になるので、コードが楽になる。

■View で login/logiout の表示を制御する

app/Posts/index.ctp

<div>
	<?php if ($auth->loggedIn()) : ?>
	<?php echo h($auth->user('username')); ?> さん、こんにちは <a href="/cakeu/Users/logout">logout</a>
	<?php else: ?>
	<a href="/cakeu/Users/login">login</a>
	<?php endif ?>
</div>
<div class="posts index">
	<h2><?php echo __('Posts'); ?></h2>
	<table cellpadding="0" cellspacing="0">
...

実際は「こんにちは○○さん」のところは、View のコンポーネントとして用意したほうがいいと思う。そうしないと、あちこちに View に同じコードが散らばるし、あとからフォーマットを変えようと思ってえらいことになってしまう。login 状態による分岐なので、Controller でレンダリングする方法もあるのだが、「こんにちは」の部分とか、login, logout へのリンクは view の範疇になるので、Controller に押し込むとちょっと変な形になりそう。ってことで View に。

ログインしているかどうかは $this->Auth->loggedIn() でしらべて、 $this->auth->user(‘username’) でユーザ名を拾ってくる。username 自体はデータベースの列名そのままなので、ニックネームとかロールとかも拾える。

そんな訳で続きは、ユーザ名やロールによって処理を分ける方式を。

カテゴリー: CakePHP パーマリンク

[CakePHP] シンプルな認証を実装する(認証の中盤) への1件のコメント

  1. ピンバック: cakephpでviewからログイン判定してアカウント表示する機能 | world is wonderful always

コメントは停止中です。