4月 2010のアーカイブ
EzAuth でユーザー認証の仕組み #Codeigniter
なんだかイメージですが何重もの構造になっているような気がして頭がおかしくなって死ぬ。という印象があって、後で見たときに絶対「どんな仕組みになっているのかさっぱりわからねぇ」と思う自信100%なので書き残しておく。
EzAuth の認証(というより、ロール)設定は以下の組み合わせによって行われています。
1. ユーザーに直接記録される情報。

テーブル「ez_access_keys」に記録されています。user_id は、ez_users の id と紐付けられており、program と access がアクセスが許可されるエリアになります。
2. プログラムに設定される情報。

各コントローラーのインスタンスに protected_pages というクラス変数により設定されます。配列になっており、それぞれ左辺の値はクラスメソッドを指し、右辺の値はアクセスが許可されるエリア情報です。
ez_access_keys の program に設定されている値は、コード上では $this->ezauth->program に該当し、ez_access_keys の access に設定されている値は、コード上では protected_pages の右辺に該当する、という事です。
program は「家」 access が「鍵」だとすると、proteced_pages のそれぞれ左辺の値は「部屋」
家(default)に対する鍵(user)で開ける事ができる部屋は、 client部屋と changepw部屋。admin部屋を開ける為には admin という鍵が必要になります。
その鍵を持たせるかどうかを、データベースで設定させる訳です。
一方で、ユーザー「admin」はすべての部屋を開けることのできるオールマイティキーを持っているので、client部屋およびchangepw部屋については自由に出入りができる仕組みです。
なお、protected_pages で指定されていない部屋については単純に「鍵がかかっていない」という認識になりますので、認証不要のページは宣言も不要です。
EzAuth でユーザー認証(1.7.2で動作させます!) #Codeigniter
Codeigniter では、カートライブラリは標準で添付されているのにも関わらず認証ライブラリが標準では添付されていない!という個人的にはちょっと悩ましい状況になっています。
公式の Wiki にはサードパーティ製のライブラリが数多く登録されており、認証ライブラリもそのうちの一つで現時点でも数だけなら20以上の登録があります。(※ Category:Libraries -> Authentication )
悩ましいなぁ、悩ましいなぁ。と_つぶやいて_いたところ、
@Hampom @terakuma CodeIgniterの認証系だれかヒトバシラーで試して欲しいですと言ってみる … http://bizwidgets.biz/user_guide/ezauth.htm
と @matagaさんにリプライをいただいたので、ニート歴1ヶ月で大変お時間に余裕がありそうな私。試してみる事にしました!(お仕事探してますよ!えぇ!)
早速、EzAuth を配布サイト(http://bizwidgets.biz/ezauth/)よりダウンロードしてみました。
アーカイブを展開すると Codeigniter 本体そのものも含まれてしまっている様です。EzAuth としてどこまで改変してあるのか不安&面倒なので、ちょっと立ち止まってもしまいましたが、解体して、さらに古いバージョンの Codeigniter ベースであった為、現在は非推奨となっている Validation クラスが使われている部分を Form_validation に置き換えるなどの改変も加えています。
前置きが長くなりましたが、EzAuth として Codeigniter に組み込むファイルをアーカイブしました。以下のURLよりダウンロードしてください。
http://hampom.humming-code.com/Codeigniter-EzAuth/EzAuth.tar.gz
2010年4月7日更新:
libraries/MY_Session.php のインスタンス記述に誤りがありましたので修正しました。
アーカイブの中に格納されているファイルは以下の通りです。
css や images などは、サンプルページで使用しているものですので公開ディレクトリにコピーしてください。
EzAuth として必要不可欠なファイルは libraries ディレクトリの2ファイル及び、models ディレクトリの1ファイルとなります。
libraries にはコアクラスを継承したファイルがあり、MY_Controller.php ファイルは EzAuth で必要な _remap() が設定されていますので、MY_Controller を用いてコントローラーを作成する事で、個別に _remap() を記述しなくとも済むようにしました。 MY_Session.php については、認証後セッションにオブジェクトを入れる仕組みになっているんですが、Codeigniter のバグにより、うまく出し入れができません。本家のフォーラムでも話題になっていたので、そちらのフォーラムにあったスクリプトをそのまま入れています。(CI 1.7 Session Bug within object storage)
models にある ezauth_model.php にて認証をすべて担っています。
サンプル通り動かすためには、これらのファイルをすべて Codeigniter に上書きでコピーし、autoload設定をします。
config/autoload.php
$autoload['libraries'] = array('database', 'session');
$autoload['helper'] = array('url', 'cookie');
さらに session をデータベースで動作させるよう config/config.php を変更します。
config/config.php
$config['encryption_key'] = "適当にアルファベット&数値で埋めましょう";
$config['sess_use_database'] = TRUE;
データベースの作成と、config/database.php の設定も忘れずに!テーブルは3つ。さらにセッション用に+1つ。以下のクエリを実行すれば作成されます。
CREATE TABLE ci_sessions ( session_id varchar(40) NOT NULL DEFAULT '0', ip_address varchar(16) NOT NULL DEFAULT '0', user_agent varchar(50) NOT NULL, last_activity int(10) unsigned NOT NULL DEFAULT '0', user_data text NOT NULL, PRIMARY KEY (session_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE ez_access_keys ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) DEFAULT NULL, program varchar(255) DEFAULT NULL, access varchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; INSERT INTO ez_access_keys (id, user_id, program, access) VALUES (1, 1, 'default', 'user'), (2, 2, 'default', 'admin'); CREATE TABLE ez_auth ( user_id int(11) NOT NULL, `password` varchar(255) DEFAULT NULL, reset_code varchar(255) DEFAULT NULL, cookie_hash varchar(255) DEFAULT NULL, activation_code varchar(255) DEFAULT NULL, PRIMARY KEY (user_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO ez_auth (user_id, `password`, reset_code, cookie_hash, activation_code) VALUES (1, 'f7d13da0a68b723f5b4e5a58d0e3c6e9', '', '45d192365165b2c5e9ed3adeada2acce', '16470a4b35ed04a8a139deab0c52e9a1'), (2, '1fd8528f5c64c09f96f16b5bb7dc2a3a', NULL, '45bd7b865824d63f4ee930cc903c1a72', 'fde180e7739caa7722f0fd7cdde25c79'); CREATE TABLE ez_users ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(50) DEFAULT NULL, email varchar(255) DEFAULT NULL, register_date datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; INSERT INTO ez_users (id, username, email, register_date) VALUES (1, 'client', 'hoge@hoge.com', '2010-04-03 00:00:00'), (2, 'admin', 'hoge@hoge.com', '2010-04-03 00:00:00');
設置は以上です!
