MySQL przyznaje wszystkie uprawnienia do bazy danych z wyjątkiem jednej tabeli


Nie udało mi się znaleźć rozsądnego rozwiązania, aby osiągnąć następujące cele:
Chcę mieć użytkownika, który ma WSZYSTKIE uprawnienia do bazy danych (lub serii baz danych o tym samym schemacie) dla

wyjątek

jedna tabela, do której będą mieli tylko uprawnienia SELECT.
Zasadniczo chcę, aby użytkownik miał swobodę manipulowania bazą danych, ale nie mógł aktualizować określonej tabeli.
Do tej pory próbowałem bez powodzenia:
  • Przyznaj wszystkie uprawnienia w tej bazie danych (nazwa_db. *), A następnie przyznaj konkretnie tylko wybrane uprawnienia w tej żądanej tabeli (mając nadzieję, że to nadpisze „wszystko”, głupie, wiem).
  • Przyznaj wszystkie uprawnienia do tej bazy danych (nazwa_db. *), A następnie cofnij wstawianie, aktualizowanie i usuwanie. Ale to spowodowało błąd informujący, że nie ma reguły grantu dla db_name.table_name.

Z tego, co udało mi się zebrać, będę musiał indywidualnie nadać wszystkie uprawnienia dla każdej tabeli bazy danych z wyjątkiem tabeli tylko do odczytu.

Niech ktoś mi powie, że jest łatwiejszy sposób


Uwaga
: Używam MySQL 5.1. Najnowsza wersja jest dostępna w systemie Ubuntu 10.04.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wiem, że to stary post, ale pomyślałem, że dodam do pytania @tdammers, aby inni mogli go zobaczyć. Możesz również WYBRAĆ CONCAT na information_schema.tables, aby utworzyć polecenia grantu bez konieczności pisania oddzielnego skryptu.
Najpierw cofnij wszystkie uprawnienia z tej bazy danych:
REVOKE ALL PRIVILEGES ON db.* FROM user@localhost;

Następnie utwórz wyciągi GRANT:
SELECT CONCAT("GRANT UPDATE ON db.", table_name, " TO user@localhost;")
FROM information_schema.TABLES
WHERE table_schema = "YourDB" AND table_name <> "table_to_skip";

Skopiuj i wklej wyniki do swojego klienta MySQL i uruchom je wszystkie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

AFAIK, tak, musisz podać indywidualnie dla każdego stołu. Ale hej, masz tam komputer. Komputery świetnie sobie radzą z automatyzacją powtarzalnych zadań, więc dlaczego nie stworzyć skryptu, który wykonuje następujące czynności:
  • Pobierz listę wszystkich tabel w bazie danych (
    SHOW TABLES;
    )
  • Przyznaj wszystkie uprawnienia dla każdej pozycji na liście
  • Odwołaj uprawnienia do tabeli niestandardowej

Lub alternatywnie:
2. dla każdej pozycji na liście sprawdź, czy jest to specjalna tabela; Jeśli to

nie

więc przyznaj wszystkie uprawnienia
Nie podaję kodu, ponieważ można to zrobić w dowolnym języku skryptowym za pomocą narzędzi MySQL, nawet skryptu powłoki; użyj tego, co jest dla Ciebie najwygodniejsze.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto szkic tego, czego używam, aby zapewnić role w MariaDB.
Może ustawienie WYDARZENIA sprawi, że będzie fajniej :-)
DELIMITER $$DROP PROCEDURE IF EXISTS refreshRoles $$
CREATE PROCEDURE refreshRoles ()
COMMENT 'Grant SELECT on new databases/tables, revoke on deleted'
BEGIN
DECLARE done BOOL;
DECLARE db VARCHAR(128);
DECLARE tb VARCHAR(128);
DECLARE rl VARCHAR(128);
DECLARE tables CURSOR FOR
SELECT table_schema, table_name, '_bob_live_sg' FROM information_schema.tables
WHERE table_schema LIKE '%bob\_live\_sg' AND
( false
OR table_name LIKE 'bundle%'
OR table_name LIKE 'cart%'
OR table_name LIKE 'catalog%'
OR table_name LIKE 'url%'
); DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=true; CREATE ROLE IF NOT EXISTS '_bob_live_sg';
REVOKE ALL, GRANT OPTION FROM '_bob_live_sg'; OPEN tables;
SET done = false;
grant_loop: LOOP
FETCH tables INTO db, tb, rl;
IF done THEN
LEAVE grant_loop;
END IF;
SET @g = CONCAT('GRANT SELECT ON `', db, '`.`', tb, '` TO ', rl);
PREPARE g FROM @g;
EXECUTE g;
DEALLOCATE PREPARE g;
END LOOP;
CLOSE tables;
END $$DELIMITER ;CALL refreshRoles;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Niestety MySQL ma wbudowane naturalne sposoby wykonywania selektywnych/wyjątkowych zadań.
Możesz użyć następującego skryptu (skrypt bash konsoli linux)
#!/bin/bash# Define the database and root authorization details
db_host='localhost'
db_name='adhoctuts'
db_user='root'
db_pass='Adhoctuts2018#'# Define the query to get the needed tables
table_list=$(mysql -h $db_host -u $db_user -p"$db_pass" -se "select concat(table_schema,'.',table_name) from information_schema.tables where table_schema='$db_name' and table_name not like 'tbl1' AND table_name not like '\_\_%';" $db_name | cut -f1)# Convert the query result into the array
table_arr=(${table_list//,/ })# Declare the associative array of the users as username=>password pair
# e.g: declare -A user_list=(["'user1'"]="pass1" ["'user2'"]="pass2")
# In our case there is a single user
declare -A user_list=(["'aht_r'@'localhost'"]="Adhoctuts2018#")
for user in "${!user_list[@]}"
do
pass=${user_list[$user]}
# Recreate user
mysql -h $db_host -u $db_user -p"$db_pass" -se "drop user if exists $user; create user $user identified by '$pass';" # Provide SELECT privilege
mysql -h $db_host -u $db_user -p"$db_pass" -se "revoke all privileges, grant option from $user;" $db_name
mysql -h $db_host -u $db_user -p"$db_pass" -se "grant usage on $db_name.* TO $user;" $db_name
for tbl in "${table_arr[@]}"; do
echo "grant select on $tbl TO $user"
mysql -h $db_host -u $db_user -p"$db_pass" -se "grant select on $tbl TO $user;" $db_name
done
done

Jeśli masz konsolę Windows, możesz użyć następującego pliku .bat:
@ECHO OFF
%= Define the database and root authorization details =%
set db_host=192.168.70.138
set db_name=adhoctuts
set db_user=adhoctuts
set db_pass=Adhoctuts2018#mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "select concat(table_schema,'.',table_name) from information_schema.tables where table_schema='%db_name%' and table_name not like 'tbl1' AND table_name not like '\_\_%%';" %db_name% > tblssetlocal EnableDelayedExpansion
set user_cnt=2
set user[1]='Adhoctuts1'@'192.168.%%.%%'
set pass[1]=Adhoctuts1_2018#
set user[2]='Adhoctuts2'@'192.168.%%.%%'
set pass[2]=Adhoctuts2_2018#set i=1:loop
set user=!user[%i%]!
set pass=!pass[%i%]!
mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "drop user if exists %user% ; create user %user% identified by '%pass%';"
mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "revoke all privileges, grant option from %user%;" %db_name%
for/F "usebackq delims=" %%a in ("tbls") do ( mysql -h %db_host% -u %db_user% -p"%db_pass%" -se "grant select on %%a TO %user%;" %db_name%
)
if %i% equ %user_cnt% goto :end_loop
set/a i=%i%+1
goto loop:end_loop
del/f tbls

Najpierw piszesz zapytanie, aby uzyskać listę potrzebnych tabel, a następnie definiujesz listę użytkowników, którym chcesz przyznać dostęp. Musisz wykonać skrypt za każdym razem, gdy zmienia się struktura bazy danych. Stworzyłem osobny krótki samouczek dla MySQL Selective/Exceptional Tasks.
https://adhoctuts.com/mysql-se ... store
https://adhoctuts.com/mysql-se ... tore/
/
https://youtu.be/8fWQbtIISdc
https://youtu.be/8fWQbtIISdc

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się