I denne artikel skal vi tale om den nye funktion i MySQL 8-relaterede privilegiesystem, som er roller. Så lad os tale om roller, denne artikel er fuldstændig viet til roller.
Andre brugere kan have komplekse privilegier, et almindeligt eksempel på dette er en bruger, der bruges til at rapportere, denne bruger behøver ikke at skrive nogen data, men der er også mulighed for, at den ikke behøver at læse alle data. Det er meget sandsynligt, at det kun kan bruges til nogle få specifikke tabeller eller kolonner, eller det kan kun have valgt adgang til et sæt visninger, der også vil være et specifikt.
Disse privilegier kan hurtigt lægges sammen og ende i meget lange brugerdefinitioner, vi vil ikke bruge en definition, og flere bevillinger giver plads til flere fejl. I MySQL 8 kan disse privilegiesæt defineres som roller, og roller kan tildeles brugere i stedet for grundlæggende MySQL-privilegier. Roller er en samling af privilegier, som vi giver brugere.
Ligesom en ny bruger, der er oprettet med kommandoen create user, bruger vi til at oprette en rolle som nævnt nedenfor;
CREATE ROLE 'reportrole';
Du kan oprette flere roller ligesom nedenstående forespørgsel på én gang.
CREATE ROLE 'app_ro', 'app_w', 'app_dev';
Ny rolle, der er oprettet med kommandoen create role, vil ikke have nogen privilegier knyttet til sig, tilladelser kan gives til denne rolle, da den var en normal bruger.
I eksemplet nedenfor giver vi udvalgsrettigheder på alle tabellerne i COMPANY-databasen til at rapportere den rolle, vi har oprettet ovenfor.
GRANT SELECT ON company.* to repotrole;
Stjernen (*) repræsenterer alle tabeller i firmadatabasen.
Roller kan tildeles MySQL-brugere, i eksemplet nedenfor opretter vi 'company_ro' hos localhost-bruger.
CREATE USER IF NOT EXISTS 'company_ro'@'localhost' IDENTIFIED WITH mysql_native_password BY 'company_pass' WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
Husk, at brugeren ikke bare er et brugernavn, men snarere dens bruger hos værten i MySQL, og så kan den gentage rollen tildeles den med tildeling af genbenyttelse til brugeren som vist nedenfor.
GRANT 'repotrole' to 'company_ro'@'localhost';
Den aktuelle rollefunktion i MySQL hjælper med at bestemme, hvilken rolle den aktuelle bruger har.
mysql> select current_role(); +----------------+ | current_role() | +----------------+ | NONE | +----------------+
Rolleprivilegierne stables op, hvilket betyder, at brugerne vil have de privilegier, der er beskrevet af Unionen af basisprivilegierne og dens roller. Meget vigtigt, at hvis brugeren får tildelt rollen, er den ikke aktiveret som standard. vi vil se sidstnævnte i slutningen af dette afsnit.
Definition af obligatoriske roller
Obligatoriske roller er roller, der vil blive tilknyttet af alle brugere som standard styres af den obligatoriske variabel.
SET PERSIST mandatory_roles =‘rolle1,rolle2′;
mysql> SET PERSIST mandatory_roles='dbt3_read23';
Obligatoriske roller, ligesom eksplicit tildelte roller, træder ikke i kraft, før de er aktiveret. Du vil se, hvordan du aktiverer rollen sidst i dette indlæg.
Øv roller
Lad os gøre dette praktisk talt, vi opretter en rolle og tildeler den til flere brugere, vi tilføjer privilegier på alle tabellerne i firmadatabasen, og vi tilføjer endnu et udvalgt privilegium på sys-tabellen som vist nedenfor.
mysql> create role 'repotrole';
Så giv privilegierne til den rapporterende bruger.
mysql> grant select on company.* to 'repotrole'; mysql> grant select on sys.version to 'repotrole';
Lad os oprette til brugere, bruger1 på localhost og bruger2 på localhost med forskellige adgangskoder
mysql> create user 'user1'@'localhost' identified by 'foo'; mysql> create user 'user2'@'localhost' identified by 'bar'; mysql> grant 'repotrole' to 'user1'@'localhost'; mysql> grant 'repotrole' to 'user2'@'localhost';
De bliver oprettet, tildeler dem repotrole-rollen, og kontroller derefter med show grants, om de har repotrole-rollen.
mysql> show grants for 'user1'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user1`@`localhost` | | GRANT `repotrole`@`%` TO `user1`@`localhost` | +----------------------------------------------+ mysql> show grants for 'user2'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user2`@`localhost` | | GRANT `repotrole`@`%` TO `user2`@`localhost` | +----------------------------------------------+
De gør det i stedet for at skulle udskrive begge privilegier for begge brugere, vi har lige oprettet repotrole-rollen, og den rolle tilføjede begge privilegier til begge nye brugere, vi oprettede.
Tjek også brugerne med pt-show-grants.
Bruger1
[[email protected] ~]# pt-show-grants | grep user1 -- Grants for 'dbt3_user1'@'%' CREATE USER IF NOT EXISTS 'dbt3_user1'@'%'; ALTER USER 'dbt3_user1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user1`@`%`; GRANT `dbt3_reader`@`%` TO `dbt3_user1`@`%`; -- Grants for 'user1'@'localhost' CREATE USER IF NOT EXISTS 'user1'@'localhost'; ALTER USER 'user1'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*F3A2A51A9B0F2BE2468926B4132313728C250DBF' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user1`@`localhost`; GRANT `repotrole`@`%` TO `user1`@`localhost`;
Bruger2
[[email protected] ~]# pt-show-grants | grep user2 -- Grants for 'dbt3_user2'@'%' CREATE USER IF NOT EXISTS 'dbt3_user2'@'%'; ALTER USER 'dbt3_user2'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' DEFAULT ROLE `dbt3_read23`@`%` REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user2`@`%`; -- Grants for 'user2'@'localhost' CREATE USER IF NOT EXISTS 'user2'@'localhost'; ALTER USER 'user2'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user2`@`localhost`; GRANT `repotrole`@`%` TO `user2`@`localhost`;
Så pt-show-grants viser repotrole-rollen for begge brugere.
Hvis du vil lære at bruge pt-show-grants, brug linket nedenfor
Installer og brug Percona Toolkit på Centos 7
Lad os starte MySQL-klienten igen og denne gang tildele repotrole-rollen til comp1-brugeren.
mysql> grant 'repotrole' to 'comp1'@'localhost';
Lad os forlade MySQL-klienten og Logan comp1-brugeren. Angiv blot brugernavnet og adgangskoden på kommandolinjen.
Det er ikke en god idé at angive adgangskoden på kommandolinjen på produktionssystemer, fordi den vil blive registreret i historien. Lad os se efter tilladelser med showbevillinger.
mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |
Så brugeren har repotrole-rollen, men dens privilegier er ikke aktiveret endnu. Du kan se 'dbt3_read23'-rollen allerede er der, fordi denne rolle er blevet indstillet som PERSIST obligatoriske_roller , når du opretter en ny bruger, vil denne rolle automatisk blive tildelt.
Aktiveringsroller
Vi kan bruge sæt rollerepotrole til at aktivere rollen, og så tjekker vi show grants.
mysql> set role 'repotrole'; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT SELECT ON `company`.* TO `comp1`@`localhost` | | GRANT SELECT ON `sys`.`version` TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+
Du kan se, at comp1-brugeren allerede havde rettighederne til alle firmatabellerne, det er derfor, vi tildelte denne bruger rollen til denne øvelse, men repotrole-rollen vil tilføje det nye privilegium til systemversionstabellen.
Vi kan vende tilbage til standardrollen og kontrollere privilegierne igen.
mysql> set role none; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+ This time the user kept the dbt3_read23 role because it had it as base privileges but it won't have the privilege to sys.version table that version anymore because that came from the role.