0

この素晴らしいユーザー システムが目の前にあるとしましょう。ユーザーはセッション キー (user_id) によってログインされます。ただし、ユーザーが「禁止」された場合、ユーザーはセッションが期限切れになるまでログインしたままになります。

これを防ぐ方法は次のとおりです。

  1. ユーザーが禁止されているかどうかを常に確認します(すべてのリクエスト)

  2. おそらくデータベースにセッションデータを保存して、データを簡単に削除できるようにします(ユーザーが禁止されている場合)。

このタスクを実行するためのより良いアプローチはありますか?

4

4 に答える 4

1

私は1を選びます。各リクエストでデータベースからユーザー情報を取得しないと、ユーザーがデータを更新する際にも問題が発生する可能性があります。たとえば、自宅でログインし、プロファイルの説明を「foo」に変更して仕事に行くことができます。そこにもログインすると、別のセッションになります。情報を「bar」に変更します。これは、データベースと作業セッションに保存されます。次に、家に帰って、以前に開いたホーム セッションでブラウジングを続けます。このホーム セッションには、まだ 'foo' が含まれています。

したがって、リクエストごとに少なくともユーザーデータベースに対して何らかのチェックを行う必要があると思います。そのため、そのステップでユーザーが禁止されているかどうかも確認できます。

これを高速化するために、ストレージ タイプが MEMORY の特別なテーブルを保持して、セッション情報を保持することができます。このテーブルは非常に高速にアクセスできるため、パフォーマンスが向上する可能性があります。ユーザーが「実際の」データベースで変更された場合にのみ、そこに情報を移動する必要があります。同様の方法で memcache を使用できます。どちらも、データベース IO を最小限に抑えながら同じ結果を得るためのソリューションです。これらの最適化は、必要な場合にのみ追加します。リクエストごとにユーザーにクエリを実行することから始めます。

于 2012-11-23T09:25:53.000 に答える
0

禁止されているかどうかを確認するために最後にチェックされたセッションに含めるだけです。次に、ユーザー テーブルの禁止リストに対して定期的にチェックします。

于 2012-11-23T09:21:37.403 に答える
0

までにすべてのリクエストを確認する必要がありますuser_id。それは多くの計算ではありません。RedisMemcachedなどのメモリ内ストレージを使用してペアを保存user_id=>bannedし、迅速にチェックできます。セッションが安定していないため、2番目は機能しません。ブラウザからでも、さまざまなコンピューターからログインできます。そのようなタスクを実行するには、複雑なロジックとはるかに多くのリソースが必要になります。

于 2012-11-23T09:28:11.417 に答える
0

多くのユーザーがいるサーバーではロード時間が大幅に増加するため、すべてのリクエストでデータベースに接続することは望ましくありません。

Memcacheただし、禁止されたユーザーのリストを保存および取得するために使用できます。これにより、データ要求時間が短縮されます。

 if((isset($_SESSION['isloggedin']) && $memcache->get('banneduserid') === true))
 {
     session_unset(); 
     session_destroy();
 }

Memcacheは非常に使いやすく、以前に使用したことがなくても楽しく学べます。

$memcache->set()たとえば、memcache オブジェクトを $memcache としてインスタンス化してから、やなどのメソッドを実行するだけです$memcache->get()。それでおしまい!

于 2012-11-23T09:47:27.577 に答える