У MySQL нет разрешений на основе строк. Лучшее, что вы можете сделать, это построить представления, чтобы показать определенные записи. Простым способом было бы добавить таблицу сопоставления с именами пользователей mysql к идентификаторам отдела, к которым у них есть доступ, и иметь представление, которое будет отображаться в этой таблице сопоставления, присоединенной к оригиналу, где она ограничена текущим запрашивающим пользователем. Вы можете использовать CURRENT_USER()
, чтобы получить текущего пользователя mysql.
Затем ограничьте пользователей представлением, а не исходной таблицей.
Вот разбивка этапов:
CREATE TABLE `mysqluser_dept` (
`mysqluser` varchar(255) NOT NULL DEFAULT '',
`DepartmentId` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`mysqluser`,`DepartmentId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE VIEW filtered_view AS
SELECT o.* FROM original_table o
JOIN mysqluser_dept m on m.DepartmentId = o.DepartmentId
WHERE m.mysqluser = current_user() GROUP by o.id;
Вы можете ограничить select o.*
в представлении по мере необходимости для конкретного набора полей, если вы не хотите, чтобы показать все столбцы исходной таблицы. Теперь заполните таблицу сопоставления mysqlusers колонке департамента при необходимости. Текущий пользователь возвращает точного пользователя, поэтому используйте полную пользовательскую строку (имя пользователя @ localhost, имя пользователя @% и т. Д.) Или измените представление, чтобы отрубить хост в сравнении.
Теперь пользователь может получить доступ к фильтруемому_view и видеть только строки, к которым у них есть доступ по отделам. Бонус: поскольку это много-ко-многим, вы можете иметь людей в нескольких отделах, если это необходимо - группа по первичному ключу исходной таблицы избегает дублирования записей.
Возможно, вам также захочется заблокировать права доступа к таблице сопоставления mysqluser_department.
Вы должны сделать это со стороны приложения. На самом деле это довольно просто. – Alexander
Когда вы говорите пользователям Mysql, вы говорите, что пользователи MySQL, перечисленные в таблице mysql.user, вы подключаетесь к БД с или «пользователями» в таблице, называемой «User» в вашем приложении. – Ray
Я имею в виду фактических пользователей MySQL. Мы позволяем MySQL обрабатывать пользовательские привилегии как можно больше. Таким образом, пользователи могут подключаться только к нашему приложению, если они действительно могут подключаться к базе данных и получать доступ к ней. – ErikvdW