0

今のところ、私はメンバーと呼ばれるテーブルを持っています。これには、conactデータ、銀行データに分割されたものが含まれています
。これで、管理者はユーザーを作成、更新、削除できるはずです。これらのユーザーは別のテーブルに保存されます。管理者にのみアクセスできます。ユーザーは自分のmysqlユーザーアカウントを取得する必要があり、管理者もアクセス許可を設定できる必要があります。たとえば、ユーザーは銀行のデータにアクセスできません。
今のところ、ユーザーアカウントを作成および削除するトリガーを作成しました。トリガーにアクセス許可を適用したかったの
ですが、列のアクセス許可の設定についてすでに考えた有望な解決策は見つかりませんでしたが、列を追加したい場合は、別のものがあります。この場合は編集する必要があります。 。
また、1:1の関係についても検討しましたが、機能するコードが見つかりませんでした。

他に解決策はありますか?

4

1 に答える 1

2

簡単に言うと、ユーザーにデータベースへの直接アクセスを許可しないでください。それらは決して接続できないはずです。保守と運用の責任者のみが本番データベースにアクセスできるようにする必要があります。これはセキュリティ上の理由によるものです。情報がデータベースに格納されるほとんどの場合、すべてのアクセスを制御し、実際の更新を処理し、選択したビジネス ロジックを適用するアプリケーションがあります。

データとビジネス ロジックを混在させないでください。

Oracle など、データベース自体の内部にビジネス ロジックの多くを保存して適用することに優れたデータベース システムがいくつかあります。ただし、これは別のタイプのアプリケーション用であり、システムを構築するための別のアプローチです。

MySQL には、これを簡単に行うためのツールがすべて備わっているわけではありません。アプリケーション ロジックをトリガー、ストアド プロシージャ、およびビューで記述し、ユーザーにデータベースへの直接アクセスを許可しようとすると、メンテナンスの悪夢に直面することになります。

何かにサインアップしたときに、最後にデータベースへの直接アクセスが許可されたのはいつですか? Twitter、Netflix、Groupon、Facebook -- ビジネス ルールを適用し、ユーザーに代わってデータベースにデータを読み書きする Web ベースのアプリケーションを操作しています。

デバッグ、プロファイリング、コードのソース管理、共同開発、単体テスト、継続的インテグレーション、デプロイ ツールなど、アプリケーション ソフトウェアの作成を容易にするツールはたくさんあります。すべてをデータベースに書き込もうとすると、すべてが失われます。

これがどのように機能するかの簡単な例を次に示します。

パーミッション システムを、user、group、user_group の 3 つのテーブルとして構成します。ユーザーはシステム内のユーザー アカウントを保持し、グループは「管理者」、「クライアント」、「匿名」などのさまざまなレベルのアクセスを保持します。グループは、ユーザーにアクセス レベルを割り当てる方法です。

`CREATE TABLE `user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(64) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 CREATE TABLE `group` (
  `group_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_group` (
  `user_id` int(10) unsigned NOT NULL,
  `group_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`user_id`,`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;`

ここでいくつかのグループを定義します

`insert into `group` (name) values ('admin'), ('user'), ('anonymous');`

ユーザーを管理者グループに追加します。

`insert into user (email) values ('admin@yoursite.com');`
`insert into user_group (user_id,group_id) values (1,1);`

現在、このアクセス許可モデルは、ユーザーが 1 つ以上のセキュリティ グループに所属できることを示しています。アプリケーションはそれらのグループをチェックし、結果に基づいてさまざまなアクションを実行します。いくつかの疑似コードを見てみましょう:

ユーザーのグループをロードします。

class User {

  private $user_id;
  private $groups;
  private $db;

  function load_groups() {
    // query the database
    $result = $db->query("SELECT name FROM `group` g JOIN user_group ug USING (group_id) WHERE user_id={$this->user_id}");
    // save an array of group names
    while ($row = $result->fetchrow()) {
      $this->groups[] = $row['name'];
    }
  }

  function is_member($group) {
    if (in_array($group, $this->groups) {
      return true;  // user group includes this value
    }
    return false;  // user is not in the group
 }

アプリケーションにデータを表示する関数があるとしますが、ユーザーのグループに応じて異なる結果が生成されます。

function display_data($user_object) {
   display_basic_data();   // everyone sees the basic data
   if ($user_object->is_member('admin')) {  
     // if the user is an admin, then display bank data too
     display_bank_data();
   }
}

同様に、データを変更する関数は、ユーザーが何かを変更する権限を持っていることを確認する必要があります。

于 2012-07-07T23:52:35.233 に答える