zoukankan      html  css  js  c++  java
  • MySQL 操作命令梳理(4)-- grant授权和revoke回收权限

    在mysql维护工作中,做好权限管理是一个很重要的环节。下面对mysql权限操作进行梳理:

    mysql的权限命令是grant,权限撤销的命令时revoke;
    grant授权格式:grant 权限列表 on 库.表 to 用户名@'ip' identified by "密码";
    revoke回收权限格式:revoke 权限列表 on 库.表 from 用户名@'ip';

    下面通过一些例子说明:
    1.grant授权
    1)grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。

    mysql> grant all on *.* to wang@'192.168.1.150' identified by "password";           //all等同于all privilege,其中的privileges可以省略
    mysql> grant all privileges on *.* to wang@'192.168.1.%' identified by "123456";    //192.168.1.%表示一个网段
    mysql> grant insert,select,update,delete,drop,create,alter on huanqiu.* to wang@'%' identified by "123456";
    mysql> flush privileges      //授权之后,不要忘记更新权限表
    

    2.查看权限
    1)查看当前用户下所有的权限

    mysql> show grants;
    +----------------------------------------------------------------------------------------------------------------------------------------+
    | Grants for root@localhost                                                                                                              |
    +----------------------------------------------------------------------------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
    | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
    +----------------------------------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    

    2)查看指定用户下的所有权限
    USAGE是默认的初始状态,表示无任何权限!!
    下面表示wang用户在192.168.1.0/24网段登陆本机mysql后,对huanqiu库下的所有表有insert,update,alter,delete,create,select的操作权限!

    mysql> show grants for wang@'192.168.1.%';           //可以在select user,host,password from mysql.user执行结果中找对应的权限用户信息
    +---------------------------------------------------------------------------------------------------------------+
    | Grants for wang@192.168.1.%                                                                                   |
    +---------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
    | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                    |
    +---------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    

    3.revoke撤销权限
    revoke跟grant语法差不多,只需要把关键字 “to” 换成 “from” 即可,并且revoke语句中不需要跟密码设置。
    注意:revoke可以回收所有权限,也可以回收部分权限。

    mysql> revoke all on *.* from wang@'192.168.1.150';                   
    mysql> revoke all privileges on *.* from wang@'192.168.1.%';               
    mysql> revoke insert,select,update,delete,drop,create,alter on huanqiu.* from wang@'%';
    mysql> flush privileges    
    

    注意事项:
    1)grant, revoke用户权限后,该用户只有重新连接MySQL数据库,权限才能生效。
    2)如果想让授权的用户,也可以将这些权限grant给其他用户,那么授权时需添加选项 "grant option"!
    如下设置后,那么这个wang用户连接mysql后也可以将这些权限授予其他用户。

    mysql> grant insert,select,update,alter on huanqiu.* to wang@'%' identified by "123456" with grant option;
    

    -------------------------------------------------------------------------------------------------------------------
    mysql授权表一共涉及到5个表,分别是user、db、host、tables_priv和columns_priv。
    这5张表的内容和用途如下:
    1)user表
    user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

    2)db表
    db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

    3)host表
    host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。

    4)tables_priv表
    tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。

    5)columns_priv表
    columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。
    ------------------------------------------------------------------------------------------------------------------
    看下面一个实例:
    给wang用户授权的权限太大了,现在要收回部分权限,只留给wang用户select和alter的权限。

    mysql> show grants for wang@'192.168.1.%';
    +---------------------------------------------------------------------------------------------------------------+
    | Grants for wang@192.168.1.%                                                                                   |
    +---------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
    | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                    |
    +---------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    mysql> revoke insert,update,delete,create on huanqiu.* from wang@'192.168.1.%';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show grants for wang@'192.168.1.%';
    +---------------------------------------------------------------------------------------------------------------+
    | Grants for wang@192.168.1.%                                                                                   |
    +---------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
    | GRANT SELECT, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                                                    |
    +---------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    

    发现revoke回收权限操作后,只剩下select和alter权限了。
    revoke回收部分权限,剩下的权限的密码保持不变。

    这里特别注意下:
    如果给一个用户设置的权限过大,除了上面使用revoke回收部分权限外,还可以使用grant进行权限修改!
    也就是说,grant不仅可以添加权限,也可以修改权限(实际上就是对同一'用户名'@'ip'设置权限,以覆盖之前的权限);
    grant修改后的权限将覆盖之前的权限!
    那么问题来了:授权后的密码是密文形式保存的,如果记不住之前授权时的密码,那么怎样保证覆盖后的权限跟之前的权限一致?

    莫慌!
    grant授权操作中其实不仅可以设置明文密码,也可以设置密文密码,如下:
    1)grant 权限列表 on 库.表.* to 用户名@'ip' identified by "明文密码"
    2)grant 权限列表 on 库.表.* to 用户名@'ip' identified by password "密文密码"

    也就是说:
    在grant重置权限的时候可以用查看的密文密码当做新的密码,然后去覆盖之前的权限,这就保证了修改前后的密码一致!
    如上的例子,采用grant的操作如下:

    mysql> show grants for wang@'192.168.1.%';
    +---------------------------------------------------------------------------------------------------------------+
    | Grants for wang@192.168.1.%                                                                                   |
    +---------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
    | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                    |
    +---------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    
    mysql> grant alter,select on huanqiu.* to wang@'192.168.1.%' identified by password '*678E2A46B8C71291A3915F92736C080819AD76DF';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show grants for wang@'192.168.1.%';
    +---------------------------------------------------------------------------------------------------------------+
    | Grants for wang@192.168.1.%                                                                                   |
    +---------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
    | GRANT SELECT, ALTER ON `huanqiu`.* TO 'wang'@'192.168.1.%'                                                    |
    +---------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    

    通常开发同事在让运维同事开通mysql权限时,他们会在自己本地mysql里生成一个密文密码,然后把这个密文密码给运维同事,运维同事在用这个密文密码进行授权,
    那么授权的密码就只有开发同事自己知道了,其他人都不知道!比较安全的一种做法~

  • 相关阅读:
    高斯消元学习
    HDU 4596 Yet another end of the world(解一阶不定方程)
    Codeforces Round #318 div2
    HDU 4463 Outlets(一条边固定的最小生成树)
    HDU 4458 Shoot the Airplane(计算几何 判断点是否在n边形内)
    HDU 4112 Break the Chocolate(简单的数学推导)
    HDU 4111 Alice and Bob (博弈)
    POJ 2481 Cows(线段树单点更新)
    HDU 4288 Coder(STL水过)
    zoj 2563 Long Dominoes
  • 原文地址:https://www.cnblogs.com/kevingrace/p/5719536.html
Copyright © 2011-2022 走看看