CodeIgniter

CodeIgniter2.0で簡易ログイン機能を実装する。
管理者画面とか、ログインするユーザーが一人しかいない場合は、冗長なユーザー管理機能は不要。

参考

多機能なユーザー管理機能を必要とする場合

CodeIgniterのユーザ認証ライブラリ「Tank_Auth」を利用する。

多機能なユーザー管理機能を必要としない場合

Controllerを拡張して、ログインチェック機能を追加する。

データベース

  • MySQL 5.0
  • InnoDBエンジン
    を使用。
  • [admin]テーブルを用意する。
    カラム名内容
    idintauto_increment 連番
    usernamevarchar(255)ユーザー名
    passwordvarchar(255)パスワード md5()等で暗号化しておく
٤Ƴ٤Ĥ
  1
  2
  3
  4
  5
  6
-
|
|
|
|
!
 CREATE TABLE IF NOT EXISTS `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

ライブラリ

ログイン認証用ライブラリを用意する。
CodeIgniter2.0用(CodeIgniter1.xは、コントローラークラスの拡張方法が異なるので注意!)

  • ファイル名
    MY_Controller.php
  • パス
    /application/core/MY_Controller.php
  • ファイル内容(文字コードは「UTF-8N」)
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
    
    <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
    class MY_Controller extends CI_Controller
    {
        public function __construct()
        {
            parent::__construct();
            $this->load->library('session');
            $this->load->helper('url');
            
            //login check
            if($this->session->userdata('is_login') != TRUE)
            {
                // next = redirect page
                if(!$this->session->userdata('next'))
                {
                    $this->session->set_userdata(array('next'=>$this->uri->uri_string()));
                }
                redirect('auth/login/'.$this->session->userdata('next'));
            }
        }
    }
    ?>

コントローラー

ログイン認証用のコントローラーを用意する。

  • ファイル名
    auth.php
  • パス
    /application/controllers/auth.php
  • ファイル内容
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
    
    <?php
    class Auth extends CI_Controller
    {
        private $user_table = 'admin';
        
        public function __construct()
        {
            parent::__construct();
            $this->load->database();
            $this->load->library(array('session', 'form_validation'));
            $this->load->helper(array('form', 'url'));
        }
        
        public function index()
        {
            $data['username'] = "";
            $data['password'] = "";
            $data['next'] = "";
            $this->load->view('login_form', $data);
        }
        
        public function login($next='')
        {
            // after login
            if($this->session->userdata('is_login') == TRUE) {
                redirect($next);
            }
            
            // before login
            $username = $this->input->post('username');
            $password = $this->input->post('password');
            if($_SERVER['REQUEST_METHOD'] == 'POST') {
                $next = $this->input->post('next'); // hidden value from <INPUT> when login NG
            }
            
            // validation rules
            $this->form_validation->set_rules('username', 'ユーザー名', 'required');
            $this->form_validation->set_rules('password', 'パスワード', 'required');
            
            // validation check
            if ($this->form_validation->run() == TRUE) {
                //login check
                if ($this->_db_check($username, $password)) {
                    //login OK
                    $this->session->sess_destroy();
                    $this->session->sess_create();
                    $this->session->set_userdata(array('is_login' => TRUE));
                    $this->session->set_userdata(array('username' => $username));
                    redirect($next);
                }
            }
            
            // when first access OR validation error OR login NG
            $data['username'] = $username;
            $data['password'] = $password;
            $data['next'] = $next;
            $this->load->view('login_form', $data);
        }
        
        public function logout()
        {
            $this->session->sess_destroy();
            redirect('');
        }
        
        private function _db_check($username='', $password='')
        {
            $this->db->where('username', $username);
            $query = $this->db->get($this->user_table);
            if (0 < $query->num_rows()) {
                $row = $query->row();
                if($row->password == md5($password)) {
                    return TRUE;
                }
            }
            return FALSE;
        }
    }
    ?>

CodeIgniter3.0になったら、以下のメソッドは使えないみたいです。

$this->session->sess_destroy();
$this->session->sess_create();

代わりに、

$this->session->flashdata();

を使うみたいです。
(参考) https://codeigniter.com/user_guide/libraries/sessions.html?highlight=set_userdata#flashdata

ビュー

ログイン認証用のビューを用意する。

  • ファイル名
    login_form.php
  • パス
    /application/views/login_form.php
  • ファイル内容
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>ログイン認証</title>
    </head>
    <body>
     
    <p>ログインしてください。</p>
     
    <!--エラーメッセージ-->
    <font color="red"><?php echo validation_errors(); ?></font>
     
    <?php echo form_open('auth/login'); ?>
    <dl>
      <dt>ユーザ名</dt>
      <dd><input type="text" name="username" value="<?php echo set_value('username'); ?>"></dd>
      <dt>パスワード</dt>
      <dd><input type="password" name="password" value="<?php echo set_value('password'); ?>"></dd>
    </dl>
    <!--ログイン後に移動するページ-->
    <input type="hidden" name="next" value="<?php echo $next; ?>">
    <input type="submit" value="ログイン">
    </form>
     
    </body>
    </html>

ログイン認証の使い方

ログイン認証を必要とするページのコントローラーには、MY_Controller.phpを継承させる。

設置例

管理者画面の「admin」ページの設置例

  • ファイル名
    admin.php
  • パス
    /application/controllers/admin.php
  • ファイル内容
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
    
    <?php
    class Admin extends MY_Controller
    {
        public function __construct()
        {
            parent::__construct();
        }
        
        function index()
        {
            echo "login OK";
        }
    }
    ?>

通常のコントローラーは、CI_Controllerクラスを継承して作るが、
ログイン認証を行うコントローラーでは、MY_Controllerクラスを継承して作る。

オリジナルのライブラリ「MY_Controller.php」でログインチェックを行い、

  • ログイン前なら、ログインフォームに移動する。
  • ログイン後なら、admin.php(管理者画面)のindex()を表示する。

MD5

データベースに保存するパスワードは、MD5(ハッシュ関数)で暗号化しておきます。
phpMyAdminで直接データを追加する場合は、MD5のツールを使うと便利です。

(例)MD5ハッシュ計算ツール - phpspot


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-07-18 (月) 14:50:28 (2258d)