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

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

ただいまの
回答率

88.58%

後付けで特定のディレクトリをログインユーザー専用にしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,222

sc2273

score 12

前提

お世話になります。
PHPもMysqlもかじりたての初心者の質問となりますが、ご指導ご鞭撻のほどよろしくお願いいたします。

社内システムとしてSSOを導入している途中でして、IDパスワードを用いてログインしているシステムを一元化する予定です。
その一環として今回、社内専用のデータベースのログインもSSOにて実現する流れとなりました。

◆現在のサイト構造
データベースはphpとsqlベースで作成されており、現状ではBasic認証をかけております。
構造としましては以下のとおりです。
イメージ説明

◆改装後のサイト構造
これを導入するシステムの都合上、Basic認証を無くしてSAML2.0に対応させたフォームにてログインさせるよう、
下記のように作り替える必要がございました。
イメージ説明

現在ここまでは実現した状態となっておりますが、上図右下箇所に赤丸で示したとおり、
URLを知っているユーザーなら誰でも直アクセスすることで、サイトにアクセスできてしまいます。

実現したいこと

既存のサイトに後付けで会員専用ディレクトリを設定したいです。
また、前述いたしましたとおり、basic認証を使用せずログインフォームでログインしたユーザー以外をアクセスさせない必要がございます。

試したこと

・htaccessによるアクセス制限

[php]会員制サイトで特定のディレクトリ内をアクセス制限する
[https://iritec.jp/web_service/2990/]

記事を参考にindex.phpに直接アクセスした場合の処理を書こうとしましたが、
.htaccessのphpに対する”Action"の部分が分からなかったこと、認証処理判断が分からなかったことから断念いたしました。

・変数を用いたログイン判定
$id = $_POST['id']で入力されているid情報を取得し、if($id = "hoge")ならばページを表示しようとしました。
しかしながらすべてのページでページ遷移時にPOSTしているわけではないため、実装を断念いたしました。


いくつか方法は試したもののどうにも上手く動かせない状況となっております。

そもそもこの考え方が合っているかどうかや、もっとこうしたほうが良いという意見でも構いませんので、
皆さまのお力をお借りしたく、今回質問させていただきました。

何卒よろしくお願い申し上げます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

sessionを使うとすべてが解決します。

# login.php
# login
<?php 
if(!empty($_POST)) {
  if($_POST['user'] == 'validUser' && $_POST['pass'] == 'validPass') {
    session_start();
    $_SESSION['member'] = ['user' => 'validUser']:
    header('Location: https://example.com/memberTop.php');
  } else {
    echo '認証に失敗';
  }
}
?>
<form action="login.php" method="POST">
<input name="user" value="<?php echo @$_POST['user'] ?: ''; ?>">
<input name="pass" value="<?php echo @$_POST['pass'] ?: ''; ?>">
<input type="submit">
</form>
# memberTop.php
# メンバー用ページ
<?php 
include('memberOnly.php');
?>
ようこそ<?php echo $_SESSION['member']['user']; ?>さん!
# memberOnly.php
# メンバー用ページにアクセス出来るか(認証済みか)確認する処理
<?php 
session_start();
if (!isset($_SESSION['member'])) {
  header('Location: https://example.com/login.php');
  exit();
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/01 18:34

    >kunai様
    ご回答ありがとうございます!!
    教えていただいたとおりにやったところ、無事意図した通りのものができました・・!

    どうにもならず困り果てていたのでとても助かりました。
    ありがとうございました!

    キャンセル

+1

既に回答が出ていますが
ログイン情報は基本的にセッションに格納します。
どのページでもまずはセッションを取り出し、
認証済みかどうかを判断してからページを表示します。

POST(GET)などURLパラメータはいくらでも偽装できるので、
認証には向いていません。

既存サイトは何かフレームワークを使っているでしょうか?(CakePHP、CodeIgniter、Laravelなど)
使っているようであればコントローラー(MVCのC)の親クラスに
認証の処理を書くのも一般的です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/01 18:33

    >take_3306様
    ご回答ありがとうございます。
    参考にさせていただきます。

    キャンセル

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

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

関連した質問

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