mysql权限系统及设置

权限系统介绍

   MySql 的权限主要存储在几个被称为grant tables的系统表中,即:mysql.User,mysql.db,mysql,Host,mysql.table_priv和mysql.conlumn_priv。由于数据信息量小,而且访问非常频繁,所有启动时时候会Load到内存保存在特定结构中。一般手动修改权限后需要执行"FLUSH PRIVILEGES"重新加载权限信息,但通过GRANT,REVOKE 或者drop user命令修改不需要执行“FLUSH PRIVILEGES”此命令。尽量少的直接修改 grant tables 来实现用户权限变更。

权限授予与去除

  增加用户权限使用GRANT  ,去除权限用GEVOKE。

  可以通过执行:“SHOW GRANTS FOR 'username'@‘hostname’  " 命令获取用户权限,或者查询 grant tables 里面的权限信息

权限级别

1、Global Level:称为全局权限控制。所有权限信息都保存在mysql.user表中,Global Level的所有权限都是针对整个mysqld的,对所有的数据库下的所有表及所有字段都有效。

要授予Global Level的权限需要在执行GRANT命令用“*.*”来指定使用范围是Global。

例:root@localhost : mysql 05:14:35> GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO 'def'@'localhost';
Query OK, 0 rows affected (0.00 sec)

2、Database Level :是在Global Level之下,其他三个Level之上的权限级别,作用于整个数据库中的所有权限对象。相对于Global Level的权限少了以下权限:: CREATE USER , FILE , PROCESS , RELOAD , REPLICATION CLIENT , REPLICATIONSLAVE,SHOWDATABASES,SHUTDOWN,SUPER 和 USAGE,设置会覆盖地下其他相同权限,也可以别上级权限覆盖。

如果要授予Database Level的权限有两个种实现方式:


1、在执行 GRANT 命令的时候,通过“database.* ” 来限定权限作用域为 database 整个
数据库,如下:
root@localhost : mysql 06:06:26> GRANT ALTER ON test.* TO 'def'@'localhost';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 06:12:45> SHOW GRANTS FOR def@localhost;
+------------------------------------------------------------------+
| Grants for def@localhost |
+------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'def'@'localhost' |
| GRANT ALTER ON `test`.* TO 'def'@'localhost' |
+------------------------------------------------------------------+
2、先通过 USE 命令选定需要授权的数据库,然后通过“* ” 来限定作用域,这样授权的
作用域实际上就是当前选定的整个数据库。
root@localhost : mysql 06:14:05> USE test;
Database changed
root@localhost : test 06:13:10> GRANT DROP ON * TO 'def'@'localhost';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 06:15:26> SHOW GRANTS FOR def@localhost;
+------------------------------------------------------------------+
| Grants for def@localhost |
+------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'def'@'localhost' |
| GRANT DROP, ALTER ON `test`.* TO 'def'@'localhost' |
+------------------------------------------------------------------+
在授予权限的时候,如果有相同的权限需要授予多个用户,我们也可以在授权语句中一次写上多个用户信息,通过逗号(,)分隔开就可以了,如下:
root@localhost : mysql 05:22:32> grant create on perf.* to 'abc'@'localhost','def'@'localhost';
Query OK, 0 rows affected (0.00 sec)
root@localhost : mysql 05:22:46> SHOW GRANTS FOR def@localhost;
+------------------------------------------------------------------+
| Grants for def@localhost |
+------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'def'@'localhost' |
| GRANT DROP, ALTER ON `test`.* TO 'def'@'localhost' |
| GRANT CREATE ON `perf`.* TO 'def'@'localhost' |
+------------------------------------------------------------------
+
3 rows in set (0.00 sec)
root@localhost : mysql 05:23:13> SHOW GRANTS FOR abc@localhost;
+------------------------------------------------------------------+
| Grants for abc@localhost |
+------------------------------------------------------------------+
| GRANT CREATE ON `perf`.* TO 'abc'@'localhost' |
| GRANT SELECT ON `test`.* TO 'abc'@'localhost' |
+------------------------------------------------------------------+
3 rows in set (0.00 sec)

 3、Tabel Level :权限作用于语句中所指定的数控的指定表。

例:root@localhost : test 12:02:15> GRANT INDEX ON test.t1 TO 'abc'@'%.jianzhaoyang.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)
root@localhost : test 12:02:53> SHOW GRANTS FOR 'abc'@'%.jianzhaoyang.com';
+----------------------------------------------------------+
| Grants for abc@*.jianzhaoyang.com |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'%.jianzhaoyang.com' |
| GRANT INDEX ON `test`.`t1` TO 'abc'@'%.jianzhaoyang.com' |
+----------------------------------------------------------+
上面的授权语句在测试给 test 数据库的 t1 表授予 Table Level 的权限的同时,还测试了将权限授予含有通配符“% ” 的所有“.jianzhaoyang.com ” 主机。其中的 USAGE 权限是每个用户都有的最基本权限。Table Level 的权限由于其作用域仅限于某个特定的表,所以权限种类也比较少,仅有ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT UPDATE 这八种权限。

4、Column Level:权限作用于某表的某个列,针对 Column Level 级别的权限仅有INSERT , SELECT和UPDATE 这三种,只是需要在权限名称后面将需要授权的列名列表通过括号括起来

例:root@localhost : test 12:14:46> GRANT SELECT(id,value) ON test.t2 TO'abc'@'%.jianzhaoyang.com';
Query OK, 0 rows affected(0.00 sec)
root@localhost : test 12:16:49> SHOW GRANTS FOR 'abc'@'%.jianzhaoyang.com';
+-----------------------------------------------------------------------+
| Grants for abc@*.jianzhaoyang.com |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'%.jianzhaoyang.com' |
| GRANT SELECT (value, id) ON `test`.`t2` TO 'abc'@'%.jianzhaoyang.com' |
| GRANT INDEX ON `test`.`t1` TO 'abc'@'%.jianzhaoyang.com' |
+-----------------------------------------------------------------------+
注意:当某个用户在向某个表插入(INSERT)数据的时候,如果该用户在该表中某列上面没有 INSERT 权限,则该列的数据将以默认值填充

5、Routine Level:权限主要只有  EXECUTE 和 ALTER ROUTINE 两种,主要针对的对象是procedure 和 function 这两种对象

例:root@localhost : test 04:03:26> GRANT EXECUTE ON test.p1 to 'abc'@'localhost';
Query OK, 0 rows affected (0.00 sec)

6、除了上面几类权限之外,还有一个非常特殊的权限 GRANT,拥有 GRANT 权限的用户可以将自身所拥有的任何权限全部授予其他任何用户,所以 GRANT 权限是一个非常特殊也非常重
要的权限。 GRANT 权限的授予方式也和其他任何权限都不太一样,通常都是通过在执行 GRANT授权语句的时候在最后添加 WITH GRANT OPTION 子句达到授予 GRANT 权限的目的。
此外,我们还可以通过 GRANT ALL 语句授予某个 Level 的所有可用权限给某个用户,
如:root@localhost : test 04:15:48> grant all on test.t5 to 'abc';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 04:27:39> grant all on perf.* to 'abc';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 04:27:52> show grants for 'abc';
+--------------------------------------------------+
| Grants for abc@% |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'%' |
| GRANT ALL PRIVILEGES ON `perf`.* TO 'abc'@'%' |
| GRANT ALL PRIVILEGES ON `test`.`t5` TO 'abc'@'%' |
+--------------------------------------------------+
在以上五个 Level 的权限中,Table 、 Column 和 Routine 三者在授权中所依赖(或者引用)的对象必须是已经存在的,而不像 Database Level 的权限授予,可以在当前不存在该数据库的时候就完成授权。

posted on 2018-08-31 13:05  ざ柒  阅读(167)  评论(0编辑  收藏  举报