• MySQL中的权限管理


    MySQL中的权限管理

    1.授予权限

    权限信息根据其作用范围,分别存储在mysql数据库中的不同数据表中。

    当MySQL启动时会自动加载这些权限信息,并将这些权限信息读取到内存中。

    数据表描述
    user保存用户被授予的全局权限
    db保存用户被授予的数据库权限
    tables_priv保存用户被授予的表权限
    columns_priv保存用户被授予的列权限
    procs_priv保存用户被授予的存储过程权限
    proxies_priv保存用户被授予的代理权限

    根据权限的操作内容可将权限大致分为数据权限结构权限以及管理权限

    数据权限

    权限权限级别描述
    SELECT全局、数据库、表、列SELECT
    UPDATE全局、数据库、表、列UPDATE
    DELETE全局、数据库、表DELETE
    INSERT全局、数据库、表、列INSERT
    SHOW DATABASES全局SHOW DATABASES
    SHOW VIEW全局、数据库、表SHOW CREATE VIEW
    PROCESS全局SHOW PROCESSLIST

    结构权限

    权限权限级别描述
    DROP全局、数据库、表允许删除数据库、表和视图
    CREATE全局、数据库、表创建数据库、表
    CREATE ROUTINE全局、数据库创建存储过程
    CREATE TABLESPACE全局允许创建、修改或删除表空间和日志文件组
    CREATE TEMPORARY TABLES全局、数据库CREATE TEMPORARY TABLE
    CREATE VIEW全局、数据库、表允许创建或修改视图
    ALTER全局、数据库、表ALTER TABLE
    ALTER ROUTINE全局、数据库、存储过程允许删除或修改存储过程
    INDEX全局、数据库、表允许创建或删除索引
    TRIGGER全局、数据库、表允许触发器的所有操作
    REFERENCES全局、数据库、表、列允许创建外键

    管理权限

    权限权限级别描述
    SUPER全局允许使用其他管理操作,如CHANGE MASTER TO等
    CREATE USER全局CREATE USER、DROP USER、 RENAME USER 和REVOKEALL PRIVILEGES
    GRANT OPTION全局、数据库、表、存储过程、代理允许授予或删除用户权限
    RELOAD全局FLUSH操作
    PROXY全局与代理的用户权限相同
    REPLICATION CLIENT全局允许用户访问主服务器或从服务器
    REPLICATION SLAVE全局允许复制从服务器读取的主服务器二进制日志事件
    SHUTDOWN全局允许使用mysqladmin shutdown
    LOCK TABLES全局、数据库允许在有SELECT表权限上使用LOCK TABLES

    权限级别指的就是权限可以被应用在哪些数据库的内容中。

    例如,SELECT权限可以被授予到全局(任意数据库下的任意内容)、数据库(指定数据库下的任意内容)、表(指定数据库下的指定数据表)、列(指定数据库下的指定数据表中的指定字段)。

    语法

    1 GRANT 权限类型 [字段列表][, 权限类型 [字段列表]] ...
    2 ON [目标类型] 权限级别
    3 TO 账户名 [用户身份验证选项] [, 账户名 [用户身份验证选项]] ...
    4 [REQUIRE 连接方式]
    5 [WITH {GRANT OPTION | 资源控制选项}]

    权限类型:指的就是SELECT、DROP、CREATE等权限。

    字段列表:用于设置列权限。

    目标类型:默认为TABLE,表示将全局、数据库、表或列中的某些权限授予给指定的用户。其他值为FUNCTION(函数)或PROCEDURE(存储过程)。

    权限级别:用于定义全局权限、数据库权限和表权限。

    添加GRANT OPTION:表示当前账户可以为其他账户进行授权。

    其余各参数均与CREATE USER中的用户选项相同,这里不再赘述。

    查看root用户和test1用户的授权情况

    1 SHOW GRANTS FOR 'root'@'localhost';

    1 SHOW GRANTS FOR 'test1'@'%';

    ALL PRIVILEGES表示除GRANT OPTION(授权权限)和PROXY(代理权限)外的所有权限。

    USAGE表示没有任何权限。

    ON后的*.*表示全局级别的权限,即MySQL服务器下的所有数据库下的所有表,‘@‘表示任何主机中的匿名用户。

    在为用户授予权限时,可以分为6个不同的级别的语法。

    1. 全局权限:GRANT权限列表 ON . TO 账户名[WITH GRANT OPTION];
    2. 数据库级权限:GRANT权限列表 ON 数据库名.* TO 账户名[WITH GRANT OPTION];
    3. 表级权限:GRANT权限列表 ON 数据库名.表名 TO 账户名[WITH GRANT OPTION];
    4. 列级权限:GRANT 权限类型 (字段列表) [,…]ON 数据库名.表名 TO 账户名[WITH GRANT OPTION];
    5. 存储过程权限:GRANT EXECUTE|ALTER ROUTINE|CREATE ROUTINE ON {[.|数据库名.* ]|PROCEDURE 数据库名.存储过程} TO 账户名 [WITH GRANT OPTION];
    6. 代理权限:GRANT PROXY ON 账户名 TO 账户名1 [, 账户名2] ...[WITH GRANT OPTION]

    要想使用GRANT语句为用户授权,必须要拥有GRANT OPTION权限;且在启用read_only系统变量时,还必须要拥有SUPER权限。

    授予test1用户 mahaiwuji.stu表的SELECT权限,以及对id和name字段的插入权限

    1 GRANT SELECT,INSERT (id, name)
    2 ON mahaiwuji.stu
    3 TO 'test1'@'%';

    查看权限的保存情况

    1 SELECT db,table_name,table_priv,column_priv 
    2 FROM mysql.tables_priv WHERE user = 'test1';

    1 SELECT db,table_name,column_name,column_priv
    2 FROM mysql.columns_priv WHERE user='test1';

    默认在MySQL5.7中,当GRANT 语句中指定的帐户不存在时,系统不支持自动创建用户,它会报一个在user表中找不到用户的提示信息。

    例如,在为user表中不存在的test9用户授予SELECT权限。

    1 GRANT SELECT ON *.* TO 'test9'@'localhost';

    为了解决上述的问题,只需确保MySQL中 NO_AUTO_CREATE_USER模式未开启,就可以利用GRANT自动创建一个不存在的用户。

    清空默认SQL模式

    1 SET sql_mode = '';

    授予权限时,创建不存在的用户

    1 GRANT SELECT ON *.* TO 'test9'@'localhost';

    将SQL模式修改为MySQL默认的值:

    1 SET sql_mode = @@global.sql_mode;

    使用GRANT创建新用户的方式已被废弃,并在未来会被移出。因此,MySQL官方推荐使用CREATE USER语句创建用户,使用ALTER USER语句修改用户的非权限选项(如验证插件、资源控制选项等),使用GRANT为新用户授予权限。

    2.回收权限

    在MySQL中,为了保证数据库的安全性,需要将用户不必要的权限回收

    例如,数据管理员发现某个用户不应该具有DELETE权限,就应该及时将其收回。为此,MySQL专门提供了一个REVOKE语句用于回收指定用户的权限。

    复制代码
    1 # 回收指定用户的指定权限
    2 REVOKE 权限类型 [(字段列表)] [, 权限类型[(字段列表)]] …
    3 ON [目标类型] 权限级别 FROM 账户名 [, 账户名]4 # 回收表7-7中的所有权限以及可为其他用户授权的权限
    5 REVOKE ALL [PRIVILEGES], GRANT OPTION FROM 账户名 [, 账户名]6 # 回收用户的代理权限
    7 REVOKE PROXY ON 账户名 FROM 账户名1 [, 账户名2]
    复制代码

    回收test1用户的插入权限

    1 REVOKE INSERT (name, price)
    2 ON mahaiwuji.stu FROM 'test1'@'%';

    3.刷新权限

    刷新权限:指的是从系统数据库mysql中的权限表中重新加载用户的权限。

    原因在于:GRANT、CREATE USER等操作会将服务器的缓存信息保存到内存中,而REVOKE、DROP USER操作并不会同步到内存中,因此可能会造成服务器内存的消耗,所以在REVOKE、DROP USER后推荐读者使用MySQL提供的“FLUSH PRIVILEGES”重新加载用户的权限。





  • 相关阅读:
    VisualVM 分析full GC问题记录
    HTTPS协议、TLS协议、证书认证过程解析
    java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)
    java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)
    MVC中自带的异步((Ajax.BeginForm)无效
    百度富文本编辑器UEDITOR
    只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionSta
    【知识碎片】CSS 篇
    js 将json字符串转换为json对象的方法解析
    【知识碎片】Asp.Net 篇
  • 原文地址:https://www.cnblogs.com/nadian-li/p/13577799.html
Copyright © 2020-2023  润新知