[[CodeIgniter]]

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

#contents

* 参考 [#c7c5a346]

** 多機能なユーザー管理機能を必要とする場合 [#m9b00524]
CodeIgniterのユーザ認証ライブラリ「[[Tank_Auth]]」を利用する。

** 多機能なユーザー管理機能を必要としない場合 [#bce95608]
Controllerを拡張して、ログインチェック機能を追加する。

- CodeIgniterでユーザー認証
http://php-sql-gdgd.jugem.jp/?eid=56
>ControllerをextendしたMY_Controllerを使う方法で実装

* データベース [#rfa88275]
- MySQL 5.0
- InnoDBエンジン
を使用。

-[admin]テーブルを用意する。
| カラム名 | 型 | 内容 |h
| 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 ;
}}

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

-ファイル名
 MY_Controller.php

-パス
 /application/core/MY_Controller.php

-ファイル内容(文字コードは「UTF-8N」)
#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'));
		}
	}
}
?>
}}

* コントローラー [#gb4fb35e]
ログイン認証用のコントローラーを用意する。

-ファイル名
 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;
	}
}
?>
}}

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


* ビュー [#l8e8fb2a]
ログイン認証用のビューを用意する。

-ファイル名
 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>
}}

*ログイン認証の使い方 [#g1ccd6f9]
ログイン認証を必要とするページのコントローラーには、MY_Controller.phpを継承させる。

** 設置例 [#vaca1757]
管理者画面の「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」でログインチェックを行い、
-ログイン前なら、ログインフォームに移動する。
-ログイン後なら、admin.php(管理者画面)のindex()を表示する。

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

(例)[[MD5ハッシュ計算ツール - phpspot>http://phpspot.net/php/pg%EF%BC%AD%EF%BC%A4%EF%BC%95%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E8%A8%88%E7%AE%97%E3%83%84%E3%83%BC%E3%83%AB.html]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS