PHPプログラムに関する各種メモ書き

CodeIgniterの簡易パスワード認証ライブラリ Minimal_auth.php

CodeIgniterで開発中にあるクラスだけパスワード認証をかけたい、または簡易なログイン画面を付けたい場合があります。
その時は以下のライブラリ【Minimal_auth.php】を用意するといいでしょう。
CodeIgniterのセッションを利用して超簡易パスワード認証をつけることができます。
SHA-256でハッシュしていますので、Basic認証、Digest認証の代わりにどうぞ。
またロボット対策として動的にhiddenを生成して送っています。

1. application/libraries にファイル名 Minimal_auth.php として保存

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Minimal_auth {
  private $CI;
  private $_login_flag = false;

  public function __construct(){
    $this->CI =& get_instance();
        $this->CI->config->load('minimal_auth');
    $this->CI->load->library('session');
  }

  public function view_login($flag=''){
    $sess = $this->CI->session->all_userdata();
    $err_mess = '';
    if (strcmp($flag,'error')==0){
      $err_mess = 'ログインエラーです。';
    }
    print <<< DOC_END
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/sha256.js"></script>
<script>
function make_hidden(e,n,d){var m=document.createElement("input");m.type="hidden",m.name=e,m.value=n,d?document.forms[d].appendChild(m):document.forms[0].appendChild(m)}
</script>
<style type="text/css">
*{
  font-size:12px;
  font-family: serif;
}
</style>
</head>
<body>
{$err_mess}
<form method="post" action="{$sess['login_url']}" onsubmit="return false;" >
<h1>パスワードを入力してください。</h1>
<input type="password" id="in_text" name="in_text">
<input type="button" value="送信" onclick="var v = document.getElementById('in_text').value; v = CryptoJS.SHA256(v); make_hidden('apb',v); document.getElementById('in_text').value=''; this.form.submit();">
</form>
</body>
</html>
DOC_END;
  }

  public function login_submit(){
    $password_sha256 = hash( 'sha256', $this->CI->config->item('admin_password') );
    if (strcmp($password_sha256, $this->CI->input->post('apb') )==0 && ( strcmp($this->CI->input->post('apb'),'') != 0 ) ){
      $sess = $this->CI->session->all_userdata();
      $session['_login_flag']  = true;
      $this->CI->session->set_userdata($session);
      redirect( $sess['jump_to'] );
      exit();
    }
    else{
      $this->view_login('error');
      exit();
    }
  }

  public function login( $login_url, $jump_to ){
    $sess = $this->CI->session->all_userdata();
      if ( @$sess['_login_flag']  == true ){
        return;
      }
    elseif ( preg_match('/login_submit/', uri_string() ) ){
      $this->login_submit();
    }
    else{
      $session['login_url']    = $login_url;
      $session['jump_to']      = $jump_to;
      $session['_login_flag']  = false;
      $this->CI->session->set_userdata($session);
      $this->view_login($login_url);
      exit();
    }
  }

}

2. application/config にファイル名 minimal_auth.php として保存

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['admin_password'] = 'hogehoge';// パスワード(適宜変更すること)

3. 認証を付けたいコントローラー(例: application/controllers/Admin.php) に以下を追加

    public function __construct(){
        // コンストラクタに以下の2行を追加
        $this->load->library('minimal_auth');
        $this->minimal_auth->login( site_url("admin/login_submit"), (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] );
    }

    // 以下のメソッドを追加(中身は空でいいです。 クラス名やメソッド名を変更した場合は上の「admin/login_submit」も変更すること)
    public function login_submit(){
    }

以上で /index.php/admin/ 以下の任意のメソッドにパスワード認証がつきます。
なおパスワード有効期間はセッション有効期間ですので application/config/config.php を以下の例のように記述してください。

$config['sess_expiration'] = 60*60*24;  // セッションを終了させたい秒(例:24時間)。
$config['sess_save_path'] = APPPATH.'session';  // セッション保存ディレクトリ(例:application/session/)。
$config['sess_match_ip'] = TRUE;    // セッションのIPアドレス照合(例:照合する)。
$config['sess_time_to_update'] = 60*5;  // セッションID更新秒(例:5分)。

関連エントリー

No.958
10/16 17:12

edit

CodeIgniter
セッション