CodeIgniter2.0で簡易ログイン機能を実装する。
管理者画面とか、ログインするユーザーが一人しかいない場合は、冗長なユーザー管理機能は不要。
参考 †
多機能なユーザー管理機能を必要とする場合 †
CodeIgniterのユーザ認証ライブラリ「Tank_Auth」を利用する。
多機能なユーザー管理機能を必要としない場合 †
Controllerを拡張して、ログインチェック機能を追加する。
- CodeIgniterでユーザー認証
http://php-sql-gdgd.jugem.jp/?eid=56ControllerをextendしたMY_Controllerを使う方法で実装
データベース †
- MySQL 5.0
- InnoDBエンジン
を使用。
- [admin]テーブルを用意する。
カラム名 型 内容 id int auto_increment 連番 username varchar(255) ユーザー名 password varchar(255) パスワード md5()等で暗号化しておく
1
2
3
4
5
6
| - | | | | ! |
|
ライブラリ †
ログイン認証用ライブラリを用意する。
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
<?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
<?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
<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
<?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のツールを使うと便利です。