0

PHPでWebアプリケーションを構築しています。ユーザーは自分のアカウントでアクセスします。Facebook のように、システムには写真やメモなどのリソースがあります。

私の最初の問題は、アカウントのプライベート リソースに誰もアクセスできないことです。これが絵だとしましょう。3 つの状況があります。

  1. 画像のURLで誰でもその画像にアクセスできます。
  2. その写真の所有者アカウントの友人アカウントは、その写真にアクセスできます。
  3. 所有者のアカウントだけがその写真を見ることができ、他の人は見ることができません。写真のURLでも。

Facebook がポイント 1 のようなことをしているかどうかはわかりません。ビジネスは重要であり、ユーザーのプライバシーも重要だからです。

私の最初のアイデアは、PHP ファイルを介してすべてのリソース アクセスを作成することでした。しかし、しばらくすると、それは本当に複雑に見えました。

私のもう 1 つのアイデアは、すべてのリソースのリストをデータベース テーブルに保持し、プライバシー設定をまとめることでした。これはより良いアイデアのように見えますが、時間の経過とともにパフォーマンスがどのように影響を受けるかはわかりません.

このようなシステムをどのように構築しますか?

PS Web アプリケーションをもう 1 つ追加し、共有リソースを配置する共有リソース領域を作成する予定です。そこでも同じ特権システムが必要になります。

4

2 に答える 2

2

うーん..

  1. アプリケーションに「User_ID」があります。
  2. アクセスしたいディレクトリ(url)があります。
  3. このディレクトリには所有者 " User_ID" が含まれています。お気に入り/store/user_9892/album_2/beer&girls.jpg

User IDそのため、ディレクトリ内の " " が現在のアプリケーション実行者 ID であるか、友人として所有者を持っているかを確認する 1 つの SQL クエリを実行できます。その場合は、アクセスを許可してください。Else - 403 ヘッダー (またはその他) でリダイレクトします。
これは、リソースなどを含むテーブルが必要ないことを意味します。非常に高速な SQL クエリで所有者\友人の状態を確認するだけです。

編集:
他のアカウントを委任する場合は、'user'テーブル フィールドに追加するだけで済みます。たとえば、名前を付けます'access_accounts'。シリアライズされた配列かもしれませんし、特殊文字で区切られたテキストかもしれません。繰り返しますが、現在の User_ID の権限について 1 つの SQL クエリをチェックインするだけです。

さらに進んで、任意のフォルダーに任意のアクセス権を定義する必要がある場合 (任意の人物、任意の人物グループなど) ... そうです、のような構造のテーブルが必要だと思います[path]=>[access_id]。しかし、アイデアは再び機能します - シンプルな 1 つの SQL チェックです。

PSこれはすべて、「PHPファイルを介してすべてのリソースにアクセスする」ことに投票することを意味します。.htaccessこれは、いくつかの SQL クエリとルールを含む php-script を使用して簡単に実行できます。

于 2012-09-06T20:29:24.277 に答える
1

私の経験では、公開されていないディレクトリにファイルをアップロードすることで、これを最もよく解決できます。次に、データベースに少なくとも3つの列(ファイルの名前、ファイルに付与するアクセスレベル、およびファイルをアップロードしたユーザー)を持つテーブルがあります。

次に、訪問しているユーザーがファイルにアクセスできるかどうかをチェックする何かを書くことができます。まず、言及されたファイルに関する情報を含む列を取得します。その情報に基づいて、ユーザーがアクセスできる場合は、readfile(PHPマニュアルの例を参照)を使用してファイルを表示します。他のすべての場合は、403Forbiddenページを表示するだけです。

あなたの場合、アクセスをチェックする関数は次のようになります。

function hasAccess($accesslevel, $owner, $visitor) 
{
    if ($accesslevel === 'public') {
        return true;
    }
    if ($accesslevel === 'private') {
        return $owner === $visitor;
    }
    if ($accesslevel === 'friends') {
        return $owner === $visitor || isfriend($visitor, $owner);
    }
}

これは単なる例であり、環境に応じて、実装はおそらく少し異なります。

私の知る限り、Facebookはすべてのファイルをすべての人が閲覧できるようにしているだけですが、推測が難しいURLを作成しようとしています。URLを取得するとすぐに、画像をアップロードしたユーザーのプライバシー設定に関係なく、画像自体を表示できます。

于 2012-09-06T21:41:56.227 に答える