簡単に言うと、ユーザーにデータベースへの直接アクセスを許可しないでください。それらは決して接続できないはずです。保守と運用の責任者のみが本番データベースにアクセスできるようにする必要があります。これはセキュリティ上の理由によるものです。情報がデータベースに格納されるほとんどの場合、すべてのアクセスを制御し、実際の更新を処理し、選択したビジネス ロジックを適用するアプリケーションがあります。
データとビジネス ロジックを混在させないでください。
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();
}
}
同様に、データを変更する関数は、ユーザーが何かを変更する権限を持っていることを確認する必要があります。