さて、サクサク進めましょう。

ログインを実装する

管理画面用の AppController.php に認証コンポーネントを設定しました。その結果 /admin/ アクセスしようとすると /admin/admin/login に遷移するようになりましたので、早速ログインを実装してきます。

こちらもチュートリアルの記事が参考になります。AdminController.php にloginメソッドを追加します。

public function login(){
    if ($this->request->is('post')) {
        $admin = $this->Auth->identify();
        if ($admin) {
            $this->Auth->setUser($admin);
            return $this->redirect($this->Auth->redirectUrl());
         }
         $this->Flash->error('管理者IDかパスワードが不正です。');
    }
}

loginテンプレートを作成します。Template/Admin/Admin/login.ctp を作成して、こんな感じでフォームを作ります。

<h1>管理者ログイン</h1>
<?= $this->Form->create() ?>
<?= $this->Form->control('admin_cd') ?>
<?= $this->Form->control('password') ?>
<?= $this->Form->button('Login') ?>
<?= $this->Form->end() ?>

ログインした後のことを考えて、 home メソッドとテンプレートも作りましょう。

AdminController.phpに以下を追加します。

public function home(){

}

Template/Admin/Admin/home.ctp を作ります。中身は適当に。

ログアウトも必要ですね。logoutメソッドも作りましょう。AdminController.phpに以下を追加します。

public function logout() {
$this->Flash->success('ログアウトしました');
return $this->redirect($this->Auth->logout());
}

1,000文字超えてしまったので、続きはまた次回。

だいぶ間があいてしまいました。
が、バージョン3.5もリリースされたことなので、そちらを使って管理画面の構築を続けていきます。
CakePHPのアプリケーションが作成されていて、DBの設定とPrefixルーティングが済んだ状態の想定です。

adminテーブルを作る

まずはテーブル「admin」を作ります。
最近はバージョン管理システムでスキーマの変更も管理できるように、PHPスクリプトでテーブルを作ったりすることも出来るようですが、レトロエンジニアな私はDDLで作ります。こんな感じ。

--
-- テーブルの構造 `admin`
--

CREATE TABLE `admin` (
`id` int(11) NOT NULL,
`admin_cd` varchar(255) CHARACTER SET utf8 NOT NULL,
`admin_name` varchar(64) CHARACTER SET utf8 NOT NULL,
`password` varchar(255) NOT NULL,
`role` char(1) NOT NULL DEFAULT '0',
`delete_flg` char(1) NOT NULL DEFAULT '0',
`create_user` int(10) NOT NULL,
`modified_user` int(10) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `admin`
--
ALTER TABLE `admin`
ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `admin`
--
ALTER TABLE `admin`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

いずれ管理者ごとに権限を制御をするかもしれないので、一般的そうな項目に「role」を付け加えておきました。

モデルとテンプレートをbakeする

テーブルが出来たら、そう、bakeしてモデルとテンプレートを作ります。

bin\cake bake model admin
bin\cake bake template --prefix admin admin

–prefix を忘れずに。(はい、私は忘れました_| ̄|○。)

再度 /admin/Admin にアクセスしてみましょう。
こんな風に表示されたらOKです。

これで下準備が終了。

管理者ログインを作成して、認証を設定する

管理者用のログイン処理、認証コンポーネントを設定していきます。
CakePHP3 で一般ユーザにログインを追加する方法は、チュートリアルのこちらに詳しく記載があります。
ここで考えなきゃいけないのが、作りたいのが「管理者」用のログインであるということです。
すなわち、一般ユーザとは分ける必要があります。
結論を言うと、以下のように設定していきます。

  • /admin/ 用の AppController.php を追加する。
  • 追加した AppController.php に管理者に認証コンポーネントを設定する。
  • AdminController.php の継承元を追加した AppController.php に変更する。

/admin/ 用のAppController.php は元々あるAppController.php をコピーして作り、namespace 部分を次のように変更します。
namespace App\Controller\Admin;
チュートリアルを参照しながら、Authコンポーネントを設定します。具体的には initialize メソッドを次のようにします。
public function initialize()
{
    parent::initialize();

    $this->loadComponent('RequestHandler');
    $this->loadComponent('Flash');

    $this->loadComponent('Auth',[
        'authenticate' => [
            'Form' => [
                'userModel' => 'Admin',
                 'fields' => [
'username' => 'admin_cd',
'password' => 'password'
],
              'finder' => 'auth',
            ]
        ],
        'loginAction' => [
'controller' => 'Admin',
'action' => 'login'
],

        'loginRedirect' => [
             'controller' => 'Admin',
             'action' => 'home',
        ],
        'storage' => [
'className' => 'Session',
'key' => 'Auth.Admin'
]

]);
}

ポイントは次の通りです。ソースの上から順番に。
(ソースコードがフォーマット出来てなくゴメンなさい。)

  • モデル(テーブル)はAdmin(admin)を使用する。
  • ログインのID / パスワードには、項目名 admin_cd / password を使用する。
  • 認証時にAdminテーブルを検索する時に findAuth メソッドを使用する。
  • ログイン処理は /admin/login (Adminコントローラの login メソッド)で行う。
  • ログイン後は /admin/home (adminコントローラの home メソッド)にリダイレクトする。
  • ログイン状態を Session の Auth.Admin というキーに格納する。

AdminController.php の継承元をこのファイルに変更します。
use App\Controller\Admin\AppController;

再度、 /admin/Admin にアクセスしてみると、こんなエラーになりました。

そりゃ当たり前だ。まだ login メソッド作ってませんからね。

認証を先に設定してしまったので編集画面にたどり着けませんでしたが、次回は是非。

たまには技術系のお話を。

メインで使っていたPCのバッテリーが持たなくなってきて、新年早々新しいPCを買いました。
環境を整えたり、元のPCから引っ越しなどをしておりますと、、Windows10ではhostsファイルが
簡単には編集できないようになっているんですね。
↓こんな風におこられます。

一般には必要の無いことなんでしょうが、システム開発を生業にしておりますとこれは困ります。
別の場所にファイルを作って、そちらを更新してから上書きすればいいらしいですが、それもちと不便。

さてどうしたものかと考えまして、管理者権限でエディターが動くようにすればいいことにたどり着きました。

画像に見えるとおり「Terapad」というテキストエディタを愛用しておりますので、そのショートカットを
デスクトップに作ります。マウスの右ボタンで「プロパティ」を表示して、「詳細設定」を選ぶと
「管理者として実行」のチェックボックスがあるのでチェックを入れます。
↓こんな感じ。

このショートカットにhostsファイルをドラッグアンドドロップすれば編集出来ます。めでたしめでたし。

それにしても、これってUNIX/Linuxのsetuid/setgid見たいですね。