2012-02-11 19 views
0

私はいくつかの部門を含むビジネス用のWebアプリケーションを作成しています。私はPHPとMySqlを使用してデータベースを作成しています.N(アクセス権なし)、R(読み取り専用)、RW(読み取りと書き込み)のオプションをENUMとして保存しています。セッション変数の代替?

ユーザーがログインすると、PHPスクリプトは適切な特権を見つけてセッションに格納します。たとえば、ユーザーがProductionのRWを持っている場合、セッション変数$_SESSION['production'] = RWがあります。今私は、ユーザーが生産を編集することが許可されているかどうかを確認する必要があるときは、私はセッション変数をチェックし、適切なアクションを取る。

私には20種類の特権があります。これは確かにこのようなものを保管する方法ではありません。これは、単に読み込み時間を増加させ、たくさんのメモリを必要とします。 user rightsを保管する選択肢はありますか?

注:20カテゴリのリストは拡大すると予想されます。

+0

私はセッションがこの種のもののためだと思います。データベースに格納すると、より多くのリソースが使用されます。クッキーに保管することはここにはありません。 私はそうです。グループを作る。グループ1にはフル特権があり、グループ2には少ない権限があり、グループ4には権限がありません。そんな感じ。申し訳ありませんが私は明確ではない場合。 – Alice

+0

私はすでにProductionのカテゴリがあるようなグループを既に持っています。現在はproduction_ordersなどのサブグープを持っています。それはセッションに保存しているものです。しかし、それは非常に効率的な方法ではないようです。これが明確になったと思ったら、もっと情報が必要な場合は教えてください。 – Namit

答えて

2

私は、一般的コンテキストで、メモリ要件を維持するために

$_SESSION['privileges']=array(
    'someprivilege' => 'r', 
    'someotherprivilege' => 'rw' 
) 

を使用:100の権限、20個の文字からなる名前、5つの文字の値は、ページ(4K)未満まで追加されます。ロード時間の問題は、セッションファイル上で非常に効率的なbnaryシリアライザを使用してPHPによって大幅に軽減されています。

0

適用時にのみアクセス許可を選択してください。これにより、負荷が必要なものに制限されます。

また、ユーザーごとのアクセス許可をシリアル化された形式で格納することもできます。これは、(20以上ではなく)単一の検索操作になります。その背後にあるロジックをカプセル化することで、これをデータベースとセッションの両方に簡単に保存し、簡単に管理して保存することができます。

これらの一般的な提案以外は、とにかく質問に多くの負荷がかかりません。あなたはあなたがする必要があることをする必要があります。手間が少なくてすむようにすると、権限の数を減らすことができますが、それは必要なときには明らかに役に立たないでしょう。

セッションにはどのような問題がありますか?または、具体的には、負荷によってはどういう意味ですか?

+0

私はセッションでそれらを保存しても構いませんが、あまりにも多くの変数をセッションに格納することはお勧めできません。それゆえ、私は代替手段が不思議でした。 – Namit

+1

それを読んでください。そしてあなたがそれを読んだところで、あなたに言われた数字は悪いですか?そして、あなたはその時点で、どの具体的な問題を遂行しましたか?それはあなたにとって悪いことでしたか?それを確認しましたか?あなたはインターネットのどこかに書き込まれた意見を見つけるので、注意してください。 – hakre

+0

あなたのセッションであまりにも多くの乱雑さを保存しないでください。私は最近、セッションファイルが4MBを超えるアプリケーションを調整しなければならなかった。それは悪夢だった。すべての要求で取得される比較的小さなパーミッションのセットは、セッション内のストレージに最適な候補です。 – nnichols

1

なぜあなたはデータベースにアクセス権を保存せず、ユーザーIDが必要なときにそれらをチェックしませんか? $ _SESSIONにユーザーIDだけを格納する必要があります。 これはアプリケーション全体を簡素化します。

セッションにアクセス権を保存する場合は、常に1つの時点で常に最新の状態であることを確認する必要があります。たとえば、adminがユーザーのアクセス権を変更したい場合、ユーザーをログアウトする追加の機能が必要です。たとえば、ユーザーがページにアクセスしようとするたびに$ _SESSIONを更新する必要があります。これはオーバーヘッドであり、毎回データベースを確認する必要があります。

+0

私はこれを最初にやっていましたが、上司(データベース教授)から実際にすべてのページに対してそのクエリを実行するのは良い考えではないと言われました。彼は、ページを読み込む速度を上げるので、ローカルに保存してアクセスするように頼んだ。 – Namit

+0

キャッシュを使用すると、毎回クエリを実行しないようにすることができます。アクセス権を変更する必要がある場合は、キャッシュをフラッシュできます。ユーザーにログイン/ログアウトを依頼する必要はありません。 – alex347

+0

これは良い考えですが、ビジネスアプリケーションであるため、キャッシュで後でセキュリティ問題が発生します。 – Namit

1

ユーザーのIDを使用してDBから権限を取得することによって、ユーザーがログインした後で、すべてのユーザー情報(ID、権限、およびそれらのプロパティにゲッターを持つ)をカプセル化するIDクラスを作成できます。

あなたの権利を見つける必要があるたびに、getRights()を呼び出します。あなたのアイデンティティクラスから。

関連する問題