表題の件で小ネタ。
CodeIgniter の認証系ライブラリといえば Tank Auth が有名だけど、もう何年もメンテされておらず CodeIgniter 3 にも対応してないので、
Cartalyst というところが作ってる「Sentry」をメインに使っていこうと思ってる。
Sentry は Laravel での動作がメインだけど、CodeIgniter でも動くように作られてる(というかフレームワーク関係なく単体でも動く)。
Sentry で使用されるMySQLのテーブル名は「groups」や「users」といった他でカブりそうな名前になっているので、これを「auth_groups」「auth_users」といったプレフィクスを付けた状態で使いたかったのでメモ。
MySQLテーブルの作成
MySQLにテーブルを作る際、Sentry が用意している 「mysql.sql」というファイルを使う。
この中に CREATE TABLE
群があるので、そのテーブル名を全て変更する。
今回はテーブル名に「auth_」というプレフィクスを付けることにした。
# Dump of table groups
# ------------------------------------------------------------
-- DROP TABLE IF EXISTS `groups`; ↓変更
DROP TABLE IF EXISTS `auth_groups`;
-- CREATE TABLE `groups` ( ↓変更
CREATE TABLE `auth_groups` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`permissions` text COLLATE utf8_unicode_ci,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `groups_name_unique` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
# Dump of table users
# ------------------------------------------------------------
-- DROP TABLE IF EXISTS `users`; ↓変更
DROP TABLE IF EXISTS `auth_users`;
-- CREATE TABLE `users` ( ↓変更
CREATE TABLE `auth_users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
...
以下くりかえし
とりあえずこの mysql.sql をMySQLに取り込んでテーブルを作成。
普通に使う場合(プレフィクスなし)
Composer で Sentry をインストールした後( autoload も必要)、
CodeIgniter 側で使うには以下のようにするのが良さげ。
<?php
(! defined('BASEPATH')) and exit('No direct script access allowed');
class MY_Controller extends CI_Controller {
// Sentryのインスタンスを入れる用
protected $sentry;
public function __construct()
{
parent::__construct();
// ここで Sentry のインスタンスをセット
$this->sentry = \Cartalyst\Sentry\Facades\CI\Sentry::createSentry();
}
...
通常利用ではこれで準備ができたので、あとは公式マニュアルでの Sentry::xxxxx
の部分を $this->sentry->xxxxx
に置き換えて使える。
プレフィクスありで使う
Sentry のソースを見ると、CodeIgniter の application/config/database.php
にある設定からデフォルトのプレフィクスを読み込んでる。
なので、一時的にそこを書き換えることで動いてくれた。
<?php
(! defined('BASEPATH')) and exit('No direct script access allowed');
class MY_Controller extends CI_Controller {
// Sentryのインスタンスを入れる用
protected $sentry;
public function __construct()
{
parent::__construct();
// デフォルトのプレフィクスをとっておく
$default_prefix = $this->db->dbprefix;
// 今回つけた「auth_」というプレフィクス名で一時的に上書き
$this->db->set_dbprefix('auth_');
// Sentry のインスタンスをセット
$this->sentry = \Cartalyst\Sentry\Facades\CI\Sentry::createSentry();
// デフォルトのプレフィクスに戻す
$this->db->set_dbprefix($default_prefix);
}
...
ということで以上です。
以下蛇足
Sentry を Composer でインストールする際、 illuminate/database
や illuminate/http
が必要だった。
これは Laravel のライブラリ。
で、illuminate/http
には symfony/HttpFoundation
等が必要。
これは Symfony のライブラリ。
CodeIgniter で使うのに上記2つのライバルフレームワークのものを使うのがなんか面白かったw