質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

CakePHP3.5でログイン認証の作り方

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,589

score 8

前提・実現したいこと

CakePHP3.5でログイン認証をしてセッション情報を得たいと考えています。
config/app.phpで設定しているデータベース以外を参照した認証や権限設定の作り方がよく分かりません。
SQL文を投げて認証出来れば、すごく分かりやすいのですが。。。

また、マスター系のデータベースは、共有で利用しているため勝手に構成や更新が出来ないので、アプリ用のデータベースとの併用になります。
参考になるサンプルコードが見つからないため、ご教授のほどお願いします。

<実現したい手順イメージ>
1.ログイン画面で、ユーザーIDとパスワードを入力
2.db_master.tbl_user_auths を参照して認証(登録済みのパスワードは、MD5でハッシュ化済み)
3.認証出来たら、vw_usersを参照(ユーザーIDで絞り込み抽出)
4.vw_usersで得た情報をセッション情報に記録
5.セッション情報を基に記事の編集や表示内容を制限

データベースの構成

MySQL

├ db_cakeapp        ・・・config/app.phpでdefultのデータソースとして設定
│ ├ tbl_books    ・・・記事テーブル
│ ├ tbl_roles    ・・・ユーザー権限テーブル
│ └ vw_users        ・・・ユーザー情報ビュー(db_masterのユーザーと役職情報など、権限情報が紐付け)

└ db_master
├ tbl_user_auths  ・・・認証テーブル(パスワードはMD5でハッシュ化済み)
├ tbl_users    ・・・ユーザー情報テーブル
└ tbl_posts    ・・・役職テーブル

MySQLのCREATEコード

-- db_cakeapp.tbl_books
-- 記事テーブル

CREATE TABLE `tbl_books` (
    `book_code` INT(11) NOT NULL,
    `user_no` CHAR(6) NOT NULL,
    `title` VARCHAR(50) NOT NULL,
    `comment` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`book_code`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


-- db_cakeapp.tbl_roles
-- ユーザー権限テーブル

CREATE TABLE `tbl_roles` (
    `user_no` CHAR(6) NOT NULL,
    `user_role` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`user_no`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


-- db_cakeapp.vw_users
-- ユーザー情報ビュー

SELECT m_user.user_no, user_name, m_post.post_name, t_role.user_role 
FROM db_master.tbl_users AS `m_user`
LEFT JOIN db_master.tbl_posts AS `m_post` ON m_post.post_code = m_user.post_code
LEFT JOIN db_cakeapp.tbl_roles AS `t_role` ON m_user.user_no = t_role.user_no
;



-- db_master.tbl_user_auths
-- 認証テーブル

CREATE TABLE `tbl_user_auths` (
    `user_no` CHAR(6) NOT NULL,
    `password` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`user_no`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


-- db_master.tbl_users
-- ユーザー情報テーブル

CREATE TABLE `tbl_users` (
    `user_no` CHAR(6) NOT NULL,
    `user_name` VARCHAR(50) NOT NULL,
    `post_code` INT(11) NOT NULL,
    PRIMARY KEY (`post_code`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


-- db_master.tbl_posts
-- 役職テーブル

CREATE TABLE `tbl_posts` (
    `post_code` INT(11) NOT NULL,
    `post_name` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`post_code`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

試したこと

公式サイトのチュートリアルにて、ログイン認証の項目を同じように作成してみましたが応用が分かりません。

補足情報(言語/FW/ツール等のバージョンなど)

CakePHP3.5.4
MySQL
Apache
XAMPP

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

なんとか、自己解決出来ました。

1.ビューテーブル(vw_users)を利用する方法で調べたところ、bakeで作成する方法がありました。
以下のサンプルでvw_usersをindex.phpで表示出来るようになります。
https://qiita.com/uedatakeshi/items/de4c89530860ab6b3bd7

2.よくある認証方法ではuserテーブルを使ったサンプルがあります。
このuserテーブルをvw_users(ビュー)に置き換えれて認証出来れば、やりたいことが実現できます。
https://qiita.com/yu1ro/items/5a3c81d2e705475669e9

ちなみに、vw_usersには、以下の様に password も取得出来るように修正しました。
正直なところ、セキュリティ上好ましくない方法だと感じています。
本来であれば、db_master.tbl_user_auths だけでユーザー認証を行い、認証出来たら、db_cakeapp.vw_users を抽出してユーザー情報を取得するのが正しい手順だと思います。
とりあえず、これで認証出来ておりますので、自己解決とします。

SELECT m_user.user_no, m_user.password, user_name, m_post.post_name, t_role.user_role 
FROM db_master.tbl_users AS `m_user`
LEFT JOIN db_master.tbl_posts AS `m_post` ON m_post.post_code = m_user.post_code
LEFT JOIN db_cakeapp.tbl_roles AS `t_role` ON m_user.user_no = t_role.user_no
;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る