Câu trả lời ngắn gọn:không cấp cho người dùng của bạn quyền truy cập trực tiếp vào cơ sở dữ liệu. Họ sẽ không bao giờ có thể kết nối. Chỉ những người chịu trách nhiệm bảo trì và vận hành mới có quyền truy cập vào cơ sở dữ liệu sản xuất. Điều này là vì lý do bảo mật. Trong hầu hết mọi trường hợp khi thông tin được lưu trữ trong cơ sở dữ liệu, có một ứng dụng kiểm soát tất cả quyền truy cập, ứng dụng này xử lý việc cập nhật thực tế và thực thi logic nghiệp vụ mà bạn chọn.
Không trộn dữ liệu với logic nghiệp vụ.
Có một số hệ thống cơ sở dữ liệu, chẳng hạn như Oracle vượt trội trong việc cho phép lưu trữ và áp dụng nhiều logic nghiệp vụ của bạn bên trong chính cơ sở dữ liệu. Tuy nhiên, điều này dành cho một loại ứng dụng khác và một cách tiếp cận khác để xây dựng hệ thống.
MySQL không có tất cả các công cụ đó để làm cho việc này trở nên dễ dàng. Hãy tin tôi khi tôi nói với bạn rằng bạn đang tự chuẩn bị cho cơn ác mộng bảo trì nếu bạn cố gắng viết logic ứng dụng của mình trong trình kích hoạt và các thủ tục và chế độ xem được lưu trữ, sau đó cấp cho người dùng của bạn quyền truy cập trực tiếp vào cơ sở dữ liệu.
Lần cuối cùng bạn được cấp quyền truy cập cơ sở dữ liệu trực tiếp khi bạn đăng ký một thứ gì đó là khi nào? Twitter, Netflix, Groupon, Facebook - bạn đang tương tác với một ứng dụng dựa trên web áp dụng các quy tắc kinh doanh và thay mặt bạn đọc và ghi dữ liệu vào cơ sở dữ liệu.
Có rất nhiều công cụ giúp việc viết phần mềm ứng dụng của bạn trở nên dễ dàng hơn:gỡ lỗi, lập hồ sơ, kiểm soát nguồn cho mã và phát triển cộng tác, kiểm tra đơn vị, các công cụ triển khai và tích hợp liên tục. Nếu bạn cố gắng ghi mọi thứ vào cơ sở dữ liệu, bạn sẽ mất tất cả.
Dưới đây là một ví dụ nhanh về cách hoạt động của điều này:
Cấu trúc hệ thống quyền của bạn dưới dạng ba bảng:người dùng, nhóm, nhóm người dùng. Người dùng nắm giữ các tài khoản người dùng trong hệ thống của bạn, nhóm nắm giữ các cấp độ truy cập khác nhau như "quản trị viên", "khách hàng", "ẩn danh", v.v. Nhóm là cách bạn chỉ định cấp độ truy cập cho người dùng.
`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;`
Bây giờ để xác định một số nhóm
`insert into `group` (name) values ('admin'), ('user'), ('anonymous');`
Và một người dùng, sau đó thêm họ vào nhóm quản trị viên:
`insert into user (email) values ('[email protected]');`
`insert into user_group (user_id,group_id) values (1,1);`
Giờ đây, mô hình quyền này nói rằng người dùng có thể thuộc một hoặc nhiều nhóm bảo mật. Ứng dụng của bạn sẽ kiểm tra các nhóm đó và định dạng các hành động khác nhau dựa trên kết quả. Hãy xem một số mã psuedo:
Tải các nhóm của người dùng:
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
}
Bây giờ trong ứng dụng của bạn, bạn có thể có một chức năng để xem dữ liệu, nhưng nó sẽ tạo ra các kết quả khác nhau tùy thuộc vào nhóm người dùng:
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();
}
}
Tương tự, các chức năng sửa đổi dữ liệu của bạn phải xác minh rằng người dùng có quyền thay đổi mọi thứ.