2011.3.27
CodeIgniterにはSimpleLoginという、名前の通りシンプルな認証ライブラリがあります。ところが、CodeIgniter2になって構成が大きく変わったため、まともに動作しませんでした。
そこで、分からないながらも、動くレベルまで修正してみました。
なにぶん、プログラム初心者が修正したものですので、使用は自己責任にてお願いいたします。
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL,
`password` varchar(64) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/仮にユーザーを登録する/
INSERT INTO users
VALUES (1, 'test', MD5('test'));
function __construct()
{
parent::__construct();
// シンプルログインライブラリを読み込む
$this->load->library('simplelogin');
$this->load->library('session');
$this->load->database();
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->output->set_header('Content-Type: text/html; charset=UTF-8');
}
function index()
{
// セッションでログイン状態を確認
if($this->session->userdata('logged_in'))
{
//User is logged in
echo 'あなたはログイン中です';
echo '<hr>';
echo anchor('sample/logout', 'ログアウトする');
}
else
{
//User is not logged in
echo 'あなたはログインしていません';
echo '<hr>';
echo anchor('sample/login', 'ログインフォームへ');
}
}
function login()
{
// バリデーションルール設定
$rules['username'] = "trim|required";
$rules['password'] = "trim|required";
$this->form_validation->set_rules($rules);
// バリデーションエラー時のフィールド名設定
// 詳しくは system/language/フォルダ名/validation_lang.php
$fields['username'] = 'ユーザ名';
$fields['password'] = 'パスワード';
//$this->form_validation->set_fields($fields);
// 検証エラーまたは初回アクセス時
if ($this->form_validation->run() == FALSE)
{
$this->load->view('login');
}
else
{
// ユーザ名:test パスワード:testでログインメソッド実行
$result = $this->simplelogin->login($this->input->post('username'), $this->input->post('password'));
// 結果の検証
if ($result == TRUE)
{
// リダイレクトする
redirect('sample/', 'refresh');
}
else
{
echo 'ユーザ名またはパスワードに誤りがあります。';
echo '<hr>';
echo anchor('sample/login', 'もう一度入力する');
}
}
}
function logout()
{
// ログアウトメソッド実行
$this->simplelogin->logout();
echo 'ログアウトしました';
echo '<hr>';
echo anchor('sample/', 'indexページへ');
}
}
?>
class Simplelogin {
var $CI; var $user_table = 'users'; function Simplelogin() { // get_instance does not work well in PHP 4 // you end up with two instances // of the CI object and missing data // when you call get_instance in the constructor //$this->CI =& get_instance(); } /** * Create a user account * * @access public * @param string * @param string * @param bool * @return bool */ function create($user = '', $password = '', $auto_login = true) { //Put here for PHP 4 users $this->CI =& get_instance(); //Make sure account info was sent if ($user == '' OR $password == '') { return false; } //Check against user table $this->CI->db->where('username', $user); $query = $this->CI->db->getwhere($this->user_table); if ($query->num_rows()> 0) { //username already exists return false; } else { //Encrypt password $password = md5($password); //Insert account into the database $data = array( 'username' => $user, 'password' => $password ); $this->CI->db->set($data); if(!$this->CI->db->insert($this->user_table)) { //There was a problem! return false; } $user_id = $this->CI->db->insert_id(); //Automatically login to created account if ($auto_login) { //Destroy old session $this->CI->session->sess_destroy(); //Create a fresh, brand new session $this->CI->session->sess_create(); //Set session data $this->CI->session->set_userdata(array('id' => $user_id,'username' => $user)); //Set logged_in to true $this->CI->session->set_userdata(array('logged_in' => true)); } //Login was successful return true; } } /** * Delete user * * @access public * @param integer * @return bool */ function delete($user_id) { //Put here for PHP 4 users $this->CI =& get_instance(); if(!is_numeric($user_id)) { //There was a problem return false; } if($this->CI->db->delete($this->user_table, array('id' => $user_id))) { //Database call was successful, user is deleted return true; } else { //There was a problem return false; } } /** * Login and sets session variables * * @access public * @param string * @param string * @return bool */ function login($user = '', $password = '') { //Put here for PHP 4 users $this->CI =& get_instance(); //Make sure login info was sent if ($user == '' OR $password == '') { return false; } //Check if already logged in if ($this->CI->session->userdata('username') == $user) { //User is already logged in. return false; } //Check against user table $this->CI->db->where('username', $user); $query = $this->CI->db->get_where($this->user_table); if ($query->num_rows()> 0) { $row = $query->row_array(); //Check against password if(md5($password) != $row['password']) { return false; } //Destroy old session $this->CI->session->sess_destroy(); //Create a fresh, brand new session $this->CI->session->sess_create(); //Remove the password field unset($row['password']); //Set session data $this->CI->session->set_userdata($row); //Set logged_in to true $this->CI->session->set_userdata(array('logged_in' => true)); //Login was successful return true; } else { //No database result found return false; } } /** * Logout user * * @access public * @return void */ function logout() { //Put here for PHP 4 users $this->CI =& get_instance(); //Destroy session $this->CI->session->sess_destroy(); }
}
?>application/views/login.php
シンプルログインフォーム <?php if ($this->form_validation->error_string):?>
<?php echo $this->form_validation->error_string; ?>
<?php endif;?>シンプルログインフォーム
<?php echo form_open('sample/login'); ?>
- ユーザ名(test)
- パスワード(test)
ダウンロード
[itemlink post_id=”1968″]