0

そのため、クライアントが作成した作品をクライアントが閲覧できる認証システムを構築しています。クライアントごとに 1 つだけのアカウントがあります。ログインした人がそのコンテンツを表示できるかどうかを各ページで確認する方法を見つけようとしています。

基本的に、ファイル構造は次のようになります: Client/Year/Project/ プロジェクト フォルダー内には、特定のカテゴリ (フラッシュ、ランディング ページなど) のフォルダーがあります。各フォルダー内には、ディレクトリまたはプロジェクトの表示を処理する index.php ファイルがあります。これらの各インデックス ページで、ログインしているユーザーがページを表示する権限があるかどうかを確認する必要があります。

現在、いくつかのセッション変数があります。

$_Session['loggedin'] - ログイン時に true に設定される bool のみ

$_Session['client'] - この値は、ログイン時にデータベースから取得されます。これは、クライアントのフル ネームの単なる文字列です (表示目的にも使用されます)。

現在、各ページでloggingがtrueに設定されているかどうかを確認し、各ページにこれをハードコードしています:

if(!isset($_SESSION['loggedin']) || $_SESSION['client'] != 'Clientname'){
   unset($_SESSION);
   session_destroy();
   header("Location: http://www.homepage.com");
}

ただし、このソリューションにはあまり満足していません。可能な限り自動化しようとしているためです。新しいクライアントは引き続き追加され、人々は大騒ぎせずにクライアントを追加できるはずです (すべてが機能しています)。これを除いて、この時点では問題ありません)

次のシナリオが発生する可能性があるため、クライアントが正しいことを確認する必要があります.誰かがログインしている場合、その人はそれにアクセスできます。

このようなものを処理するための良い習慣はありますか? すべてのユーザーで使用でき、新しいクライアントが追加されるたびに誰かがコードにアクセスしてクライアント名の文字列を変更する必要がないものを実装したいと考えています。

どんな種類の論理的なヘルプも素晴らしいでしょう!

4

2 に答える 2

0

$current_client = $_SESSION['client'] を設定しているため、既に認証システムが整っているようです。

また、各クライアント ディレクトリに index.php ファイルがあるとします。

そして、クライアントがルートに配置されたフォルダが配置されています。パスは次のとおりだと思います。

/root/path/to/files/$$CLIENT$$/....

あなたがする必要があるのは、現在の path/to/client を $current_client と比較することだけです。

// returns true if $str begins with $sub
function beginsWith( $str, $sub ) {
    return ( substr( $str, 0, strlen( $sub ) ) == $sub );
}

$authorized = beginsWith(__FILE__, '/root/path/to/files/' . $current_client) ;

クライアント名をハードコーディングする代わりに、それを承認に追加してください。

if(!isset($_SESSION['loggedin']) || !$authorized){
   unset($_SESSION);
   session_destroy();
   header("Location: http://www.homepage.com");
}
于 2013-07-27T03:16:31.683 に答える
0

公開されているディレクトリ構造の外にあるディレクトリにクライアント データを保存し、mod_rewrite (Apache を使用している場合) を使用して、FrontController が開始される単一の index.php にすべての要求をリダイレクトすることができます。このコントローラは、リクエスト文字列とセッション cookie に基づいて、認証と承認の手順を初期化します。

ドキュメントルートが/some/folder/public_htmlクライアントデータである場合/some/folder/data/Client/...、PHP は特定のフォルダーのコンテンツを公開します。データベースキーをフォルダーとしてプロジェクトを保存することもできます。Client/Year/Project/その場合、 butのディレクトリ構造は必要ありませんsome/folder/data/{project_key}/...。このソリューションを使用すると、ディレクトリ ナビゲーションがより簡単になります。

ここにアイデアの短い抜粋があります:

.htaccess

mod_rewrite でリクエストをリダイレクトする

RewriteEngine On
RewriteBase /path/to/client/data
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [QSA, L]

index.php

このスクリプトは、データベース接続、コントローラー、およびセッションを初期化し、リクエストを処理します。

// initialization of database connection    
$connection = ...

// controller initialziation
$controller = new FrontController($connection, ...);

// you could encapsulate the session in its own class to make
// easy requests to the session.
$session = new Session(...);

// select the requested resource by its path
$resource = $controller->selectResourceByPath($_GET['request']);

// resouce was not found
if (!$resource) {
    $controller->showNotFound($_GET['request']);
    exit(0);
}

// validate if the session is started. If not, redirect to the login page.
if (!$session->isStarted()) {
  $controller->redirect('login');
  exit(0);
}

$user = $session->getUser();

// user is not logged in
if (!$user) {
   $controller->redirect('login');
   exit(0);
}

// this is a very simple solution. You could build up separate
// authentication/authorization layer.
if ($resource->hasAccess($user))
  $controller->showResource($resource);
else
  $controller->showAccessDenied($user, $resource);

通常は、ルータ、ファイアウォール クラス、および ACL を使用して、エンティティのアクセスを保護します。また、リクエスト処理は、ルーター -> リゾルバー -> コントローラー チェーンで構造化されます。これはアイデアの抜粋です。

于 2013-07-26T16:01:12.840 に答える