Не перечисляйте базы данных, которые не принадлежат пользователю
Используя MySQL и PHPMyAdmin, я хочу дать некоторым пользователям все права на создание баз данных и их удаление. По сути, пользователь должен видеть только свои созданные базы данных и может делать с ним все, что он хочет, но он не должен взаимодействовать или видеть базы данных других пользователей.
Я видел решение с префиксом GRANT ALL ON. но это подразумевает, что пользователь знает префикс и использует его для создания всех своих баз данных.
Любая менее ограничительная альтернатива?
2 ответа
Я использую этот PHP-скрипт для добавления пользователя с указанными вами разрешениями. этот скрипт также рандомизирует пароль и помещает его в файл в домашнем каталоге пользователя. вам нужно будет это исправить, потому что это зависит от некоторых других файлов, но достаточно просто взять операторы Sql и использовать их.
#! /usr/bin/php
<?php
error_reporting(E_ALL);
define('ADMIN','true');
require_once 'utils/utils.php';
if (count($argv) < 2)
{
echo "usage : php -f ". $argv[0] . " user\n";
return;
}
$user = $argv[1];
$pass = createRandomPassword(10);
global $conn;
if(false === $conn->query("CREATE USER '$user'@'localhost' IDENTIFIED BY '$pass'")) die("mysql error\n");
if(false === $conn->query("GRANT USAGE ON * . * TO '$user'@'localhost' IDENTIFIED BY '$pass'")) die("mysql error\n");
if(false === $conn->query("GRANT ALL PRIVILEGES ON `$user\_%` . * TO '$user'@'localhost'")) die("mysql error\n");
echo "Created mysql user $user/$pass\n";
savePasswordFile($user,$pass);
function savePasswordFile($user,$pass)
{
$passfile = "/home/$user/passwords.txt";
$f = fopen($passfile,"a");
if (!$f) die("Error opening passwords file");
fputs($f, "Mysql login:\nuser : $user\npass : $pass\n\nYou may create databases named ".$user."_*, for example ".$user."_blog\n");
chown($passfile,"$user");
chgrp($passfile,"$user");
chmod($passfile,0700);
fclose($f);
}
function createRandomPassword($length)
{
$chars = "abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ023456789-!@#$%^&*";
srand((double)microtime()*1000000);
$i = 0;
$pass = '' ;
while ($i <= $length) {
$num = rand() % strlen($chars);
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
?>
Вы можете использовать webmin и создавать отдельных пользователей, а они могут создавать базы данных. http://www.webmin.com/