CakePHP1.3で作る会員管理システム(20) Authコンポーネント
Authコンポーネント
管理者側のアカウント管理(users)にいきます。
users_controller.php を開いて、アクションの add とadmin用のアクションを残して、他のアクションを削除します。
要らないので。
$helpers に ‘Javascript’ を追加します。
<?php class UsersController extends AppController { var $name = 'Users'; var $helpers = array('Javascript');
さらにその下に、
function beforeFilter() { parent::beforeFilter(); $this->Auth->allow('add'); }を追加します。
これは、アクションaddだけはAuthコンポーネントの認証から除外するって意味です。
なにしろまだアカウントを作っていないのに、Authコンポーネントで認証をかけてしまったら、誰も管理者画面にログインできなくなってしまいます。
かといってコンポーネント Auth を使う設定にしないで新規アカウントを登録しても、パスワードはplainなままで登録されてしまい、その後で Auth をかけても使えません。
次に、直下の app_controller.php を開いて、 $components に ‘Auth’ を追加します。
class AppController extends Controller { var $components = array( 'Auth', 'Session', 'Email' => array( 'from' => 'your@email', 'sendAs' => 'text', ), );
この状態で、ブラウザから、 http://localhost/~myname/cake/users/add を開いて、一人目のアカウント(管理担当者)を登録します。
エラーが出ますが、
The user has been savedのメッセージが表示されていると思います。
データベースを直接のぞいて、パスワードが暗号化されているのを確認します。
SELECT * FROM users;
以降、管理者画面へはこの一人目のアカウントでログインします。
アクションの add はもう削除してしまって構いません。
アカウントは出来たので、ログイン用の画面を作ります。ビューで、
/views/users/admin_login.ctp として、
<?php echo $this->Session->flash('auth'); ?> <div class="users form"> <?php echo $this->Form->create('User', array('action' => 'login'));?> <h2><?php __('ログイン'); ?></h2> <?php echo $this->Form->input('username',array('label' => array('text'=>'ユーザー名'))); echo $this->Form->input('password',array('label' => array('text'=>'パスワード'))); ?> <?php echo $this->Form->end(__('ログイン', true));?> </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 class="actions"> <h3><?php __('メニュー'); ?></h3> <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に飛んでくれるようになっています。 で、最初に作った公開側の会員登録画面を見てみると、こちらにもAuthコンポーネントが適用されて大変なことになってしまっているので、除外設定を行います。member_controller.php の最初に以下を追加します。
function beforeFilter() { parent::beforeFilter(); $this->Auth->allow('add','complete', 'login', 'logout', 'menu', 'edit', 'leave'); }
allow のところに除外するアクションを列挙するだけです。
ついでに、member_controller.php から、公開側の index() とか view() とか、使わないアクションを削除しておきます。