Topics トピックス

[baserCMS4]プレフィックス認証を使わずにログイン機能を実装する

2018/06/26

baserCMSでプレフィックス認証を使わずに、プラグイン側からBcAuthComponent(CakePHPのAuthComponentを拡張したもの)を使ってログイン機能を実装するための実験メモを記載します。

スクリーンショット 2018-06-26 22.56.52.png

この記事の動作環境

  • baserCMSバージョン: 4.1.1(SQLite)
  • CakePHPバージョン: 2.10.6
  • PHP: 5.6.32
  • サーバー: ローカルのMAMP環境

参考記事:
シンプルな認証と承認のアプリケーション
認証

モデルとコントローラーを用意する

今回、認証機能を持たせたいコントローラーを「LoginTesterController」、モデルを「LoginTester」(すなわちTBLは「login_testers」)とします。 認証に使うTBL「login_testers」には、ログインアカウント用のフィールド「username」と、パスワード用のフィールド「password」とを用意します。

コントローラーの設定

プラグイン内で認証機能を持たせたいコントローラーに対して、以下のようにbeforeFilterで認証のための設定を行います。

        
/**
* beforeFilter
*
* @return	void
* @access public
*/
public function beforeFilter() {
    parent::beforeFilter();
    /* 認証設定 */
    // セッションキーの変更(通常の管理画面と分けたい)
    $this->BcAuth->setSessionKey("baserCMS.logintester");
    //BcAuthの認証設定
    $this->BcAuth->authenticate = array(
        'Form' => array(
            'userModel' => 'LoginTester',
            'passwordHasher' => array(
                'className' => 'Simple',
                'hashType' => 'sha256'
            )
        )
    );
    // ログインページ
    $this->BcAuth->loginAction = "/login_tester/login_testers/login";
    // ログイン後リダイレクト先
    $this->BcAuth->loginRedirect = "/login_tester/login_testers/mypage";
    // ログアウト後リダイレクト先
    $this->BcAuth->logoutRedirect = "/login_tester/login_testers/login";
    // 認証エラーメッセージ
    $this->BcAuth->authError = "メンバー登録が必要なページにアクセスしようとしています。";
    //許可するページ
    $this->BcAuth->allow('add', 'login');
    }
        
    

基本的にはCakePHP 2.x Cookbookの通りですが、 今回はbaserCMSがもともと持っている管理画面へのログインユーザーとは分けて認証させたいので、セッションキーを手動で分けてあります。 また、過去のCakePHPでは自動でハッシュ化していたパスワード文字列ですが、現在のバージョンでは無くなっているとのことで「passwordHasher」を使ってハッシュタイプを明示しています。

あとはログイン画面(login)、ログイン後の画面(mypage)などを指定します。認証せずに表示を許可するページとして、新規登録画面(add)とログイン画面(login)を指定しています。 なお、各ページのアクションは以下のように作りました。

            
/**
* 登録処理
*
* @return void
*/
public function add()
{
    //新規会員登録
    if (!empty($this->request->data)) {
        //ユーザー追加
        if ($this->LoginTester->save($this->request->data)) {
            $this->setMessage('登録が完了しました。', false, true);
            $this->redirect(array('action' => 'add'));
        }else {
            $this->setMessage('入力エラーです。内容を修正してください。', true);
        }
    }
}


/**
* ログイン画面
*
* @return void
*/
public function login()
{
    if(!empty($this->request->data)){
        //ログイン実行
        if($this->BcAuth->login($this->request->data)){
            $this->setMessage('ログインしました。', true);
            $this->redirect(array('action' => 'mypage'));
        } else {
            $this->setMessage('ログインに失敗しました。', true);
        }
    }
}


/**
* マイページ(ログイン後の画面)
*
* @return void
*/
public function mypage()
{
    //ログイン中のユーザー名を取得する
    $username = $this->BcAuth->user('LoginTester.username');
    $this->set('username', $username);
}


/**
* ログアウト
*
* @return void
*/
public function logout()
{
    $this->redirect($this->BcAuth->logout());
}
            
        

モデルの設定

続いてモデルを設定していきます。前述の通り、パスワードが自動でハッシュ化されなくなったことに伴う処理を追記していきます。

        
        App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
        
    

まず冒頭に上の一文を記載して、このモデル内でハッシュ化のための処理が使えるように呼び出しておきます。続いてモデルクラス内に以下の処理を追記します。beforeSaveを使って、passwordが保存される際にハッシュ化するようにしています。 ちなみにここで指定されるハッシュタイプと、前項のコントローラーで指定したハッシュタイプは同一である必要があります。

        
/**
* beforeSave
*
* @params array
* @return boolean
*/
public function beforeSave($options = array()) {
    //セーブ時にpasswordフィールドが存在していればハッシュ化する。
    if (!empty($this->data[$this->alias]['password'])) {
        $passwordHasher = new SimplePasswordHasher(array('hashType' => 'sha256'));
        $this->data[$this->alias]['password'] = $passwordHasher->hash(
            $this->data[$this->alias]['password']
        );
    }
    return true;
}
    

ビューの作成

コントローラーとモデルができたらビューを用意します。各ページのアクションはすでに用意したので、そこに対応するビューを作ります。

1. add.php

        
<?php echo $this->BcForm->create('LoginTester'); ?>
<div>
    username:
    <?php echo $this->BcForm->text('LoginTester.username'); ?>
</div>
<div>
    password:
    <?php echo $this->BcForm->password('LoginTester.password'); ?>
</div>
<div>
    email:
    <?php echo $this->BcForm->text('LoginTester.email'); ?>
</div>
<?php echo $this->BcForm->end('add'); ?>
    

2. login.php

        
<?php echo $this->BcForm->create('LoginTester'); ?>
<div>
    username:
    <?php echo $this->BcForm->text('LoginTester.username'); ?>
</div>
<div>
    password:
    <?php echo $this->BcForm->password('LoginTester.password'); ?>
</div>
<?php echo $this->BcForm->end('login'); ?>
        
    

3. mypage.php

        
ようこそ<?php echo $username ?>さん、ここはマイページです。
<?php $this->BcBaser->link('logout', 'logout') ?>
        
    

ログアウト時については、すぐにログイン画面にリダイレクトされるのでビューは必要ありません。

おわりに

baserCMSのプレフィックス認証を使わずにログイン機能を持たせたい場面があれば、このような処理が使えるかも知れません。皆様の参考になれば幸いです。

タグ: 新製品 | baserCMS | PHP | CakePHP | ホームページ制作

お問い合わせCONTACT

弊社への各種ご相談は下記よりどうぞ

よくある質問

ここでは「ホームページを制作するのにどのくらいの期間が必要?」「島根県以外の遠方からでも依頼できる?」などお客様から寄せられる質問に回答しています。
下記の一覧からご覧になりたい質問内容をクリックしてください。

制作について

どのくらいの制作期間が必要ですか?

2ヶ月半〜3ヶ月程度を目処にお考え下さい。実際の作業自体はそれほどかかりませんが、お客様側でご準備いただくものや、新たに用意するもの(写真など)を考慮すると、結果的にそのくらいの期間がかかってしまうのが実情です。

法人ではなく個人事業主なのですが、制作を依頼できますか?

もちろん可能です。ただし、基本的には法人のお客様を想定したサービスとなっておりますので、気になる点などがございましたら、一度お問い合わせ頂ければと思います。

文章の校正はしてもらえますか?

本格的な校正または文章ライティングは、プロのライターに依頼することで可能です(有料)。なお、お客様からお預かりした原稿の誤字脱字等は、可能な限り確認・修正させていただいておりますが、お客様から弊社に完成原稿として提供いただくものにつきましては、なるべくお客様側にて一度チェックしていただきますよう、お願いいたします。

知り合いのデザイナーにデザインをお願いしたいのですが・・・。

事前にご相談いただければ、社外のデザイナーにデザインをお願いすることも可能です。ただし、その方に対して弊社からWeb構築に関する技術・仕様などの指導は出来ませんので、予めWebデザインが可能かどうかをデザイナーにご確認ください。

他社で作った既にあるホームページを修正したいのですが出来ますか?

他社様が制作したホームページでも修正を承っております。ご相談ください。

スマートフォン対応のホームページを作成してもらえますか?

もちろん可能です。現在主流のレスポンシブデザインという制作手法で構築できます。これはユーザーが利用している端末の画面幅に応じてレイアウトを自動で変更するもので、パソコン用のサイトとスマートフォン用のサイトを別で作る必要がないのが特徴です。

現在ホームページを持っていますが、リニューアルをお願いできますか?

もちろん可能です。リニューアルの仕方にもいろいろとあります。CMS(管理システム)やデザインの入れ替え、URLの変更など目的やご要望に応じた手法をご案内しています。

ホームページと一緒にブログも作りたいのですが、可能ですか?

多くのお客様がホームページの制作と同時にブログ機能(お知らせ、新着情報、トピックスなど呼び方は様々)を利用しています。

ホームページに掲載する内容は、一緒に考えてもらえますか?

はい。打ち合わせの際にスタッフへご相談ください。必要であればプロのライターさんに依頼することも出来ます。(有料)。

制作を依頼した場合、何を用意すれば良いですか?

打ち合わせの中で必要なものを確認して進めていきます。一般的には、会社パンフレットなどお客様の事業内容がわかる資料、ロゴマークなどのデータ、ホームページに載せたい写真・画像、

遠方(島根県以外)からホームページ制作の依頼はしてもらえますか?

リモート会議などで対応可能です。弊社では東京・大阪をはじめ、全国のお客様からのご依頼を承っております。ご相談ください。

WordPressを使ったサイト構築は可能ですか?

対応可能です。また、WordPress以外でも対応できますので、その目的・条件にあったCMSをご提案しております。

デザインのみ、コーディングのみなど、制作の一部の依頼は可能ですか?

対応可能です。弊社ではデザイン会社様、広告代理店様、システム開発会社様、ウェブ制作会社様などからの下請け案件も承っております。ご相談くださいませ。

制作会社、広告代理店からの依頼は可能ですか?

はい、対応可能です。ご相談ください。

写真撮影も行ってもらえますか?

対応可能です。弊社の関連会社もしくはパートナー企業が対応いたします。ご相談ください。

動画を使ったホームページを作成したいのですがお願いできますか?

対応可能です。動画は弊社の得意分野の一つです。撮影・編集は弊社の関連会社で映像制作専門の株式会社モットが対応いたします。

ホームページの更新を簡単にできる方法はありますか?

はい、CMS(コンテンツ・マネジメント・システム)の導入をお勧めします。CMSはホームページの管理システムのことで、IDとパスワードを使って管理画面にログインし、ホームページのデータを更新・変更します。

依頼してから完成まではどのような流れですか?

通常、以下のような流れで進んでいきます。

1.コンテンツの確定
ホームページの内容を決めていきます。どんなページがどこにあるか、というのを確定します。

2.デザインの確定
ホームページのデザインを決めていきます。色や雰囲気など最初にご相談させていただき、叩き台となるデザイン案をご用意します。

3.テストサイト構築
確認用のテストサイトをご用意します。

4.公開(納品)
テストサイトで問題なければ、本番環境へホームページを構築し公開します。

ドメイン、URLアドレスについて

現在持っているドメインを引き継ぐことは可能ですか?

可能です。場合によってはドメインの管理者権限を移す手続きが必要になることがあります。ご相談ください。

新しいドメインを取りたいのですが、取得の手配してもらえますか?

もちろん対応可能です。ドメインは「早いものがち」なので、必ずしもご希望のドメインが取得できるとは限りませんが、

サーバーについて

レンタルサーバーは用意してもらえますか?

もちろん対応可能です。弊社は「CPIサーバー(KDDIウェブコミュニケーションズ社)」「Zenlogic(ソフトバンクグループ

見積・費用・契約について

ホームページ制作に費用はどのくらいかかりますか?

ホームページはオーダーメイドになりますので、お客様のご要望の内容によって金額が変わります。

見積りを依頼するには、どのようにして問い合わせすれば良いですか?

弊社ホームページの「お問い合わせ」か、お電話にてご連絡ください。

分割払いはできますか?

原則一括払いでお願いをしておりますが、提携するクレジット会社を利用して分割することができます。ご相談くださいませ。

契約後のキャンセルはできますか?

契約後のキャンセルにつきましては、既に発生した作業の内容に応じて、キャンセル料を頂くことがあります。ご了承ください。

見積りに料金はかかりますか?

お見積りは無料です。お気軽にお問い合わせください。

制作後・メンテナンスについて

納品後のサポートはできますか?

はい可能です。更新頻度の高いサイトをお持ちのお客様や、Webサービスを運用しているお客様には、保守契約をおすすめ致しますが、保守契約の無いお客様や、他社でホームページを制作して運用中のお客様であっても、都度見積もりで対応させて頂いています。

運用は自分で行いたいのですが可能ですか?

はい、可能です。特に更新頻度が高い部分など、予めわかっていれば更新しやすいように管理機能をカスタマイズすることも出来ます。ご相談ください。

他社が作ったホームページを更新だけしてもらうことはできますか?

はい、可能です。ご相談ください。

アクセス解析・広告運用

アクセス解析はお願いできますか?

はい、可能です。レポート作成からコンサルタントによる毎月の報告会まで対応しています(有料)。ご相談くださいませ。

インターネット広告の運用代行をしてもらえますか?

はい、可能です。出稿先、予算、ターゲットなどをご相談し、最適なプランをご提案します。ご相談くださいませ。