ユーザーアクセスとユーザー許可を管理する方法
-
26-10-2019 - |
質問
私はPHP + MySQLのアプリケーションに取り組んでいます。私のアプリケーションには、ユーザー用のテーブル、関係のテーブル(友人、フォロー、購読)、投稿用のテーブルがあります。ユーザーの主なアクションは次のとおりです。
- ユーザーには友達がいます
- ユーザーは投稿エントリを作成できます
- ユーザーは友達のエントリを見ることができます
- そして最後に ユーザーは、特定の友達の視聴をブロックできます
ユーザーAがユーザーBと友達である場合、ユーザーAはユーザーBのすべてのエントリを表示できますが、ユーザーBはたとえば少数の友人のみへのアクセスを制限できます。ここで、クエリは次のとおりです。これらのアクセス許可を管理するにはどうすればよいですか?特定のエントリを表示するためにブロックされている各ユーザーを保存するテーブルを考えていましたが、1人のユーザーに数人の友達ができたら、これは良い考えではありません。それで、どうすればこれを解決できますか?誰かが私に始める方法を教えてもらえますか?たぶん、Googleで検索するのに適した用語や、似たようなものをリンクするのでしょう。
解決
あなたは正しい軌道に乗っています。リンクされたテーブルを使用したいと思います。テーブルユーザーから始めます。各ユーザーにはIDがあります。次に、テーブルusers_friendsを作成します。このテーブルは、user_idとfriend_idの2つのIDで構成されます。最後のテーブルは、user_idとrestricted_idの2つのidsで構成されるusers_restrictedです。
例えば
users
user_id name
1 user1
2 user2
3 user3
users_friends
friend1_id friend2_id
1 2
2 3
これは、ユーザー1と2が友達であり、ユーザー2と3は友達であると言います。 (これは、ユーザー1がユーザー2と友達である場合、ユーザー2もユーザーと友達であると仮定します1)
users_restricted
user_id restricted_id
1 2
ユーザー1とユーザー2は友人ですが、ユーザー2は制限されたリストにあります。つまり、ユーザー2がユーザー1のエントリを表示できるようにしません。
テーブルはIDを介してリンクされ、すべてのIDがユーザーテーブルからリンクされていることがわかります。これは、エントリにも関連するように拡張できます。 IDでエントリを参照してください。
特定のエントリをユーザーにブロックするには、次のテーブルがあります。
entries
entry_id user_id ... other columns holding entry information
1 1
2 1
3 2
4 2
ユーザー1は2つのエントリ(エントリ1とエントリ2)を作成し、ユーザー2は2つのエントリ(エントリ3とエントリ4)を作成しました。別のテーブルが制限を保持します。
entries_restricted
entry_id restricted_user_id
1 2
これにより、ユーザー2はエントリ1を表示できません。
ユーザー2にエントリを表示できるようにするために、ステートメントはこのようなものになります。
SELECT e.*, er.entry_id FROM entries e JOIN entries_restricted er ON e.entry_id=er.entry_id WHERE er.restricted_user_id != 2;
ステートメントは、ユーザー2に制限されたエントリを除くすべてのエントリ情報を選択します。
他のヒント
次のテーブルの使用を開始できます。最初のテーブルはユーザーテーブルです(jason.wolfsmithが提案したように)
users
u_user_id u_name
1 user1
2 user2
3 user3
2番目のテーブルはこのようなものです。
friends_permissions
f_user_id f_friend_id permission entries
1 2 1 entry1
2 3 0
1 3 1 entry3
このテーブルには、ビューを許可する必要があるエントリの許可と名前が含まれます。 1-いくつかのエントリを制限します。 0-すべてを許可します。列で 許可 データ型は設定された( '1'、 '0')、およびデータ型として設定される場合があります エントリ ヌル。
したがって、user1はentry1をユーザー2に表示することを許可しません。 (Entry1とEntry3はエントリテーブルからのものです)。