CodeIgniterのscaffoldはphpMyAdminの代替(しかも一時的)にしか使えないということがわかったのでfーー;
django.contrib.adminみたいなcoolなものでは無かった様子。
めげてばかりもいられないので、
・ユーザー認証
・CRUD
の作り方、要はdjangoだとcontrib.authとかcontrib.adminがやってくれちゃうところから、まず自作することにしました。 ←django流(?)に「管理画面を作ってから公開用画面を作る」です^^
まず、「codeigniter ユーザー認証」「codeigniter authentication」等のキーワードで片っ端からググりました。
すると、現在はCodeIgniterには純正認証フレームワークは付いておらず、サードパーティのプラグインやライブラリの形で公開されていることがわかりました。
#いずれ認証クラスがデフォルトで付くかもしれないけど :-)
FreakAuth
Rapyd
←プラグインですがcontrib.adminみたいなものを作ってくれるやつらしい?
どちらもアプリをフルに上書きして使う形で、既にconfigファイルを書いてしまった気の早い私には不向きです(爆)
あと、使い方のドキュメント&インターフェイスが英語ばかりなので、習得するのに時間が掛かる&画面の日本語化メンドクサという理由で却下。
そこで、
こちらのwikiを参考にControllerをextendしたMY_Controllerを使う方法で実装してみました。
application/library/MY_Controller.php
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Controller extends Controller {
function MY_Controller()
{
parent::Controller();
$this->load->database();
$this->db->query('SET NAMES utf8');
$this->load->library('session');
if($this->session->userdata('is_superuser')!='yes')
{
if($this->session->userdata('next'))
{
$this->session->set_userdata(array('next'=>$this->uri->uri_string()));
}
header("Location:".$this->config->item('base_url')."index.php/auth/login/".$this->session->userdata('next'));
}
}
}
?>
application/controllers/auth.php
<?php
class Auth extends Controller {
function Auth()
{
parent::Controller();
$this->load->library('session');
}
function login($next='')
{
if($this->session->userdata('is_supeuser')=='yes')
{
header("Location:".$this->config->item('base_url').'index.php/');
}
elseif($_SERVER['REQUEST_METHOD']=='POST')
{
$username = $this->input->post('username');
$password = $this->input->post('password');
$next = $this->input->post('next');
if($username=='admin' && $password=='admintest') //実際に使うときはIDとパスワードはdbから取ります^^;
{
$this->session->set_userdata(array('is_superuser'=>'yes'));
}
header("Location:".$this->config->item('base_url').'index.php/'.$next);
}
else
{
print_r($this->session);
$data['title'] = "ログインしてください";
$data['next'] = $next;
$this->load->helper('form');
$this->load->view('login_form', $data);
}
}
function logout()
{
$this->session->sess_destroy();
header("Location:".$this->config->item('base_url')."index.php");
}
}
?>
を用意します。
で、アクセス制限したい場合(@login_requiredな場合。笑)は、コントローラ単位で制御します。
例えば:
class Welcome extends MY_Controller {
function Welcome()
{
parent::MY_Controller();
}
function index()
{
echo "この部分はログインユーザーしか見られません。";
}
とすると、index.php/welcome/indexにアクセスすると、まずindex.php/auth/loginにぶっ飛ばされログインを要求されます。
閲覧者が正しいIDとパスワードを入力すると、めでたくindex.php/welcome/indexが表示できるというわけ。
用意する特別なファイルは2つだけだし、コントローラのコンストラクタを変えて歩くだけで認証ページに出来ちゃう。
なかなか良い感じです。今後PHP4鯖の案件はcodeigniterにしようかな〜。