Не перечисляйте базы данных, которые не принадлежат пользователю

Используя 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/

Другие вопросы по тегам