6月 07

20.Authコンポーネント

go @ 4:04 AM

管理者側のアカウント管理(users)にいきます。
users_controller.php を開いて、アクションの add とadmin用のアクションを残して、他のアクションを削除します。
要らないので。

$helpers に ‘Javascript’ を追加します。

	var $helpers = array('Html', 'Form', 'Javascript');

その下に、

	function beforeFilter() {
		parent::beforeFilter();
		$this->Auth->allow('add');
	}

を追加します。
これは、アクションaddだけはAuthコンポーネントの認証から除外するって意味です。
なにしろまだアカウントを作っていないのに、Authコンポーネントで認証をかけてしまったら、誰も管理者画面にログインできなくなってしまいます。
かといってコンポーネント Auth を使う設定にしないで新規アカウントを登録しても、パスワードはplainなままで登録されてしまい、その後で Auth をかけても使えません。

次に、直下の app_controller.php を開いて、 $components に ‘Auth’ を追加します。

	var $components = array('Auth', 'Email');

この状態で、ブラウザから、

http://localhost/~bob/cake/index.php/users/add

を開いて、一人目のアカウント(管理担当者)を登録します。
データベースを直接のぞいて、パスワードが暗号化されているのを確認します。
以降、管理者画面へはこの一人目のアカウントでログインします。
アクションの add はもう削除してしまって構いません。

アカウントは出来たので、ログイン用の画面を作ります。ビューで、
/views/users/admin_login.ctp として、

<?php echo $javascript->link(array('jquery','form','util'), false); ?>

<?php if  ($session->check('Message.auth')) $session->flash('auth'); ?>
<div class="users form">
<h2><?php __('ログイン'); ?></h2>
	<?php
		echo $form->create('User', array('action' => 'login'));
		echo $form->input('username', array('label' => 'ユーザー名'));
		echo $form->input('password', array('label' => 'パスワード'));
		echo $form->end('ログイン');
	?>
</div>

上記のような画面を作ります。

で、usersコントローラに以下のアクションを追加します。

	function admin_login() {
	}

ブラウザからともかくなにかの admin のアドレス、例えば

http://localhost/~bob/cake/index.php/admin/users/

とかを入れて、ともかくもログイン画面が表示されることを確認します。
そして作った一人目のアカウントでログインできることを確認します。

さらに、ログアウトを追加します。

	function admin_logout() {
		$this->redirect($this->Auth->logout());
	}

こちらでログアウトできることを確認します。

とりあえず動かしてみて、エラーメッセージが英語なのが気になりますよね。
そこで、直下の app_controller.php を開いて、beforeFilter の中に以下を追加します。

		$this->Auth->loginError = "ユーザー名もしくはパスワードが正しくありません";
		$this->Auth->authError = "ログインしてください";

これで日本語になると思います。
ついでに、ログインした時に今ログインしているアカウント名を常に左メニューの上の方に表示したいので、 set しておきます。
以下を直下の app_controller.php の function beforeFilter() { } の中に追加

		$this->set('loginName', $this->Auth->user('username'));

そして、レイアウトの /app/views/layouts/admin.ctp を開いて、div id=”menu” の下に一行追加します。

<div id="content">
	<div id="menu">
		<p><?php echo $loginName; ?>でログイン中</p>
		<ul>

ブラウザで開いてみて、ログイン中のアカウントの名前が表示されていることを確認します。

あと、ログイン画面のレイアウトが admin 用のもので、左メニューがあっておかしいので、左メニューのないレイアウトに変更します。
コントローラ users_controller.php を開いて、admin_login アクションに

		$this->layout = 'no_menu';

を追加します。

で、
/admin/users/add
こんなアドレスを直接叩くと、
/admin/users/login
ログイン画面にとばされる訳ですが、そのログイン画面からログインすると、ログイン後は
/admin/users/add
に飛んでくれるようになっています。
ところが、最初から、
/admin/users/login
に接続してログインすると、行き場がないのかどうか知りませんが、ルートに飛んでいってしまいます。
ルートは困る、ということで任意のアドレスを設定する場合は、上記の app_controller.php の beforeFilter の中に、

		$this->Auth->loginRedirect = array('controller' => 'members', 'action' => 'index');

と書きます。
こうすると、/admin/users/login からログインした時は、/admin/members/index にジャンプします。
これはしかし、動くんですが、どうも、 mod_rewrite を使わない設定になっていると動きがヘンになります。
なんと言ってよいか分からんですが、ヘンな動きなんですよ。
ある意味ぐちゃぐちゃです。
ということで、あきらめて、 app_controller.php の beforeFilter に、

		$this->Auth->autoRedirect = false;

と、入れて、users_controller.php の admin_login アクションに

		if($this ->data){
			$user = $this->Auth->user();
			if(!empty($user)){
				$this->redirect(array('controller'=>'users','action'=>'index'));
			}
		}

を追加します。これでログイン後は常にアカウント管理の一覧頁にジャンプします。

で、最初に作った公開側の会員登録画面を見てみると、こちらにもAuthコンポーネントが適用されて大変なことになってしまっているので、除外設定を行います。member_controller.php の最初に以下を追加します。

	function beforeFilter() {
		parent::beforeFilter();
		$this->Auth->allow('add','complete', 'login', 'logout', 'menu', 'edit', 'leave');
	}

allow のところに除外するアクションを列挙するだけです。

ついでに、member_controller.php から、公開側の index() とか view() とか、使わないアクションを削除しておきます。

>>次のページ「アカウント管理」へ

Comments are closed.

here comes