web-dev-qa-db-ja.com

PHPおよびJSを使用した許可システム

私は、さまざまなユーザーがさまざまな権限を持っている可能性があるさまざまな領域を持つ管理ダッシュボードを開発しています。例えば:

  • ニュース
    • ジョン:編集、表示、追加、削除。
    • カルロス:編集、表示;
    • マリオ:-;
  • サポート
    • ジョン:表示;
    • カルロス:編集、表示;
    • マリオ:編集、表示、追加、削除。

このアクセス許可を制御する方法は、JSON配列を介して行われ、各領域とアクセス許可のリストが含まれています。これをMySqlデータベース(最初にシリアル化する)とlocalStorageに保存します。このようにして、フロントエンドをチェックするだけでなく、PHPを介してサーバー側で最終的な検証を行うことができます。

JSONの例:

{
    "area": "news",
    "permission": [
        {"field": "access", "value": true},
        {"field": "read", "value": true},
        {"field": "edit", "value": true},
        {"field": "add", "value": true},
        {"field": "remove", "value": true}
    ]
},
{
    "area": "support",
    "permission": [
        {"field": "access", "value": true},
        {"field": "read", "value": true},
        {"field": "edit", "value": false},
        {"field": "add", "value": false},
        {"field": "remove", "value": false}
    ]
},
...

私はこのシステムに疑問を持っています。最初に、このようなことをしたことがなく、例も見つからなかったため、これが適切な方法であるかどうかわかりません。また、このアクセス許可を(チェックボックスを使用して)編集する必要がある管理ユーザーがいるため、これをJSONとして保存しているため、フロントエンドに表示する方が簡単です。

しかし、私はあなたがより良いと思う他の基準に基づいてこの方法を変更することに非常にオープンです。最初にセキュリティを確保し、メンテナンスも簡単にしたいだけです。

6
celsomtrindade

免責事項:私はこの種の問題の専門家ではありません。私と先輩が現在のプロジェクトをどのように行っているかを共有しているだけです。

データベース:

あなたのデザインは十分にしっかりしているように見えますが、これらの権限をテーブルに保持する方法について考えます。

usersテーブルがあるとしましょう

user_id | name | password
-------------------------
      0 | John |     ****

これらの権限を保持するためにデータベースを拡張する2つの方法が考えられます。

各ユーザーが何ができるかを示す権限列を追加できます

user_id | name | password| perm1 | perm2 | ... |permn
------------------------------------------------------
      0 | John |     ****|     Y |     N |     |    Y

そのためには、多くの列と厄介なデザインが必要になります。プラス面では、できることとできないことを正確に指示する細分性があります。

ただし、rolesの概念をデザインに追加することができます。

rolesテーブルを作成し、アプリケーションでユーザーロールのタイプ(およびユーザーが提供する権限の種類)を定義して、各ユーザーにロールを与えるだけです。

user_id | name | password|  role_id
-----------------------------------
      0 | John |     ****|        1

そしてrolesテーブル

role_id | role_name  | perm1 |....| permn
----------------------------------------
      0 | Admin      |     Y |    |    Y
      1 | Regular    |     N |    |    Y

このようにして、ユーザーテーブルの懸念事項の分離を作成します。すべてのユーザーデータを1つのテーブルに配置して時間とともに大きくなる可能性があります(テーブル内の数十の列を処理するのは面白くない)。関連するユーザーデータを複数に分けて配置できます。テーブル。また、クエリを短くします。

(これは、 Java Webアプリケーションがユーザーに特権/権限を提供する方法 に似ています)

PHP:

クライアントビューの場合、現在のユーザーを説明するセッションオブジェクトを保持できます。role値を使用して、ユーザーに対して生成するテンプレートの部分をphpスクリプトに指示できます。

例(ブレード):

@if (user($role) === 'admin')
    <button id="dontclickme">History eraser button</button>
@endif
3
svarog

したがって、フロントエンドの実装は私には悪くないようです。 jsでパーミッションを具体的にどのように使用するかを考え、それに基づいたjsonの構造に満足しているかどうかを確認したい場合があります。

バックエンドへのWRTでは、JSONを直接dbに格納しないようにします。データベースを介してそのデータを直接処理する必要がある場合、特にユーザー数が増えるにつれて、非効率になります。

一般に、このようなものを使用する場合は、まず composer でニーズに合ったものが見つかるかどうかを確認します。何も実行されない場合は、いくつかのパッケージを調べて、独自の実装に疑問がある場合にインスピレーションを見つけることができるかどうかを確認することをお勧めします。

0
unflores