cakephp2.x 超簡単 AuthComponent の使い方

2013年4月7日更新 view: 3315 view
photoBy: http://www.cuenote.jp/sr-s/feature/images/smtp-auth-illust01.gif

AuthComponentの使い方

ネット上に色々情報があるけど、簡単に使えるようにまとめました。

今回の設定

  • パスワードの暗号化を一切しない
  • DBの emailフィールド と passフィールド でログイン
  • cakephp 全ページを誰でもアクセスできる。
    但し、/users/block/ は要ログイン
  • User モデルでユーザー情報を格納

早速使ってみよう

パスワードを暗号化させない

cakephp 2.3.1 ではログインしようとすると勝手にパスワードを暗号化する。
よって暗号化をしない処理をする。

/lib/Cake/Utility/Security.php 107行目あたり

public static function hash($string, $type = null, $salt = false) {
        
        return $string;
        /*if (empty($type)) {
            $type = self::$hashType;
        }
        $type = strtolower($type);

        if ($type === 'blowfish') {
            return self::_crypt($string, $salt);
        }
        if ($salt) {
            if (!is_string($salt)) {
                $salt = Configure::read('Security.salt');
            }
            $string = $salt . $string;
        }

        if (!$type || $type === 'sha1') {
            if (function_exists('sha1')) {
                return sha1($string);
            }
            $type = 'sha256';
        }

        if ($type === 'sha256' && function_exists('mhash')) {
            return bin2hex(mhash(MHASH_SHA256, $string));
        }

        if (function_exists('hash')) {
            return hash($type, $string);
        }
        return md5($string);*/
    }

コメントアウトして、 $string をそのまま返すように。
これで暗号化されずに済む。

実装

まずは AppController.php から。

スポンサードリンク
<?php

App::uses('AppController', 'Controller');

class AppController extends Controller {
    
    public $components = array(
        'Session',
        'Auth' => array(
            //ログインした後のリダイレクト先
            'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
            //ログアウト後の戻り先
            'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
            //ログインフォームがあるページ
            'loginAction' => array('controller' => 'users', 'action' => 'login'),
            //使用モデル
            'userModel' => 'User',
            //email , pass フィールドで フォームから投稿があった場合のみログインさせる Formをall にすると全て許可
            'authenticate' => array(
                    'Form' => array(
                            'fields' => array(
                                    'username' => 'email',
                                    'password' => 'pass',
                            ),
                    ),
            ),
        )
    );
    
    function beforeFilter()
    { 
        $this->Auth->allow();
    }

}

つづいて、

  • ログインページ
  • 新規会員登録ページ
  • ログアウトページ
  • 一般ページ
  • 会員専用ページ

を作ります。

/app/Controller/UsersContoroller.php

<?php

class UsersController extends AppController {

    function beforeFilter(){
        parent::beforeFilter();
        
        //要ログインアクション
        $this->Auth->deny('block');
    }
    
    function index()
    {
    }
    
    //会員専用
    function block()
    {
    }
    
    function login()
    {
        $this->set('title_for_layout','ログイン');

        if($this->request->is('post')) {
            if($this->Auth->login()) {
                //OK Auth指定のログインページへ移動
                return $this->redirect($this->Auth->redirect());
            } else {
                //NG
                $this->Session->setFlash('ログインできません');
            }
        }
    }
    
    function add()
    {
        $this->set('title_for_layout','新規会員登録');
        
        //POST送信なら
        if($this->request->is('post')) {
            
            //ユーザーの作成
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('登録完了');
                $this->redirect('/users/');
            } else { //保存できなかったら
                 $this->Session->setFlash('登録できません');
            }
        }
        
    }
    
    function logout()
    {
        $this->redirect($this->Auth->logout());
        $this->autoRender = false;
    }
}

対応したビューを作成

index.ctp

<?
    if(AuthComponent::user('id')){
        echo AuthComponent::user('id').' でログイン中';
    } else {
        echo 'ログインしていません';    
    }
?>

block.ctp

会員専用ページ。<br />

login.ctp

<?php echo $this->Form->create('User', array('url' => 'login')); ?>
<?php echo $this->Form->input('email', array('label' => 'メールアドレス')); ?>
<?php echo $this->Form->input('pass', array('label' => 'パスワード')); ?>
<?php echo $this->Form->end('ログイン'); ?>

add.ctp

<?php
echo $this->Form->create('User');
echo $this->Form->input('email',array('label'=>'メールアドレス'));
echo $this->Form->input('pass',array('label'=>'パスワード'));
echo $this->Form->end('新規ユーザを作成する');
?>

これでできるハズです。

スポンサードリンク

関連記事

関連カテゴリ

コロ助

web関連の記事や制作系の記事をどんどんまとめていきます。 宜しくお願いします!

ピックアップ

パソコン・ソフトウェア ランキング

4月28日 ( 金 ) にアクセスが多かった記事はこちら!