CodeIgniter2.0で簡易ログイン機能を実装する。
管理者画面とか、ログインするユーザーが一人しかいない場合は、冗長なユーザー管理機能は不要。
CodeIgniterのユーザ認証ライブラリ「Tank_Auth」を利用する。
Controllerを拡張して、ログインチェック機能を追加する。
ControllerをextendしたMY_Controllerを使う方法で実装
カラム名 | 型 | 内容 |
id | int | auto_increment 連番 |
username | varchar(255) | ユーザー名 |
password | varchar(255) | パスワード md5()等で暗号化しておく |
#code(sql){{
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
#code(php){{
?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
#code(php){{
?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; }}
?>
}}
ログイン認証用のビューを用意する。
login_form.php
/application/views/login_form.php
#code(php){{
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
#code(php){{
?php
class Admin extends MY_Controller
{public function __construct() { parent::__construct(); } function index() { echo "login OK"; }}
?>
}}
通常のコントローラーは、CI_Controllerクラスを継承して作るが、
ログイン認証を行うコントローラーでは、MY_Controllerクラスを継承して作る。
オリジナルのライブラリ「MY_Controller.php」でログインチェックを行い、
データベースに保存するパスワードは、MD5(ハッシュ関数)で暗号化しておきます。
phpMyAdminで直接データを追加する場合は、MD5のツールを使うと便利です。