CodeIgniterで開発中にあるクラスだけパスワード認証をかけたい、または簡易なログイン画面を付けたい場合があります。
その時は以下のライブラリ【Minimal_auth.php】を用意するといいでしょう。
CodeIgniterのセッションを利用して超簡易パスワード認証をつけることができます。
SHA-256でハッシュしていますので、Basic認証、Digest認証の代わりにどうぞ。
またロボット対策として動的にhiddenを生成して送っています。
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();
}
}
}
application/config``` にファイル名
minimal_auth.php`
として保存<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['admin_password'] = 'hogehoge';// パスワード(適宜変更すること)
`
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/ 以下の任意のメソッドにパスワード認証がつきます。
なおパスワード有効期間はセッション有効期間ですので
```
$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分)。
```