一、权限体系简介:
mysql的权限体系在实现上比较简单,相关权限信息主要存储在mysql.user、mysql.db、mysql.host、mysql_table_priv和mysql.column_priv几个表中。由于权限信息数据量比较小,而且访问又比较频繁,所以mysql在启动时就会将所有的权限信息都load到内存中保存在几个特定的结构中,所以才有了我们手动修改了权限相关的表后,都需要通过执行flush privileges 命令重新加载mysql的权限信息。我们也可以通过grant,revoke或者drop user命令所做的修改权限后也会同时更新到内存结构中的权限信息。
二、权限的赋予与去除
要为某个用户授权可以使用grant命令,要去除某个用户现有的权限可以使用revkoe命令,当给用户授权不仅需要提供用户名,还可以指定通过哪个主机访问,下面提供给简单的列子:
#创建一个用户test1只能从本机登录并赋予这个用户拥有test库的查询权限mysql> grant select on test.* to test1@'localhost' identified by 'test123';query ok, 0 rows affected (0.03 sec)#创建一个用户test2可以从互联网上任何一台主机登录并赋予这个用户拥有test库的查询权限mysql> grant select on test.* to test2@'%' identified by 'test234';query ok, 0 rows affected (0.02 sec)刷新权限,并查询用户test1的权限mysql> flush privileges;query ok, 0 rows affected (0.00 sec)mysql> show grants for test1@'localhost';+--------------------------------------------------------------------------------------------------------------+| grants for test1@localhost|+--------------------------------------------------------------------------------------------------------------+| grant usage on *.* to 'test1'@'localhost' identified by password '*676243218923905cf94cb52a3c9d3eb30ce8e20d' || grant select on `test`.* to 'test1'@'localhost'|+--------------------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)删除用户test1的权限mysql> revoke select on test.* from 'test1'@'localhost' identified by 'test123';query ok, 0 rows affected (0.00 sec)在此查看用户test1,网站空间,已经没有权限了。mysql> show grants for test1@'localhost';+--------------------------------------------------------------------------------------------------------------+| grants for test1@localhost|+--------------------------------------------------------------------------------------------------------------+| grant usage on *.* to 'test1'@'localhost' identified by password '*676243218923905cf94cb52a3c9d3eb30ce8e20d' |+--------------------------------------------------------------------------------------------------------------+三、权限级别
mysql的权限分为5个级别,分别如下:
1、global lovel:
global lovel的权限控制又称为全局控制权限,所有权限信息u保存在mysql.user 表中,global lovel的所有权限都是针对整个mysqld的,对所有mysql数据库下的所有表及所有字段都有效。如果一个权限是以global lovel来授予的,服务器空间,则会覆盖其他所有级别的相同权限设置。global lovel主要有如下权限:
名称版本支持限制信息
alterall表结构更改权限
alter routine5.0.3procedure, function 和 trigger等的变更权限
createall数据库,表和索引的创建权限
create routine5.0.3+procedure, function 和 trigger等的变更权限
create temporary tables4.0.2+零时表的创建权限
create user5.0.3+创建用户的权限
create view5.0.1+创建视图的权限
deleteall删除表数据的权限
execute5.0.3+procedure, function 和 trigger等的执行权限
file
all执行load data infile 和 select... into file 的权限
indexall在已有表上创建索引的权限
insert
all数据插入权限
lock tables
4.0.2+执行lock tables 命令显示给表加锁的权限
process
all执行show processlist命令的权限
reload
all执行flush等让数据库重载load某些对象或者数据命令的权限
replcation slave
4.0.2+主从复制中slave连接用户所需的复制权限
replication client
4.0.2+执行show master status 和show slave ststus命令的权限
select
all数据查询权限
show databases
4.0.2+执行show databases的权限
shutdown
allmysql server的shut down 权限
show view
5.0.1+执行show create view命令查看view创建语句的权限
super
4.0.2+执行kill线程,change master,purge master logs, and set global等命令的权限
update
all更新数据库的权限
usage
all新创建用户后不授权时所用到拥有最小的权限
要授予global lovel权限只需要在执行grant命令的时候,用*.*来指定范围是global即可,如果有多个用户,可以使用逗号分隔开,如下:
mysql> grant all on *.* to test3,test4@'localhost' identified by 'test123';query ok, 0 rows affected (0.00 sec)2、database level
database level是在global level之下,其他三个level之上的权限级别,其作用域即为所指定数据库中的所有对象,和database level比 database level主要少了以下几个权限,create user,file,process,reload,replication client,replication slave, show databases, shutdown,没有增加任何权限,
要授予database level权限,用如下方式实现:
1)、在执行grant命令的时候,通过database.* 来指定作用域为整个数据库:或者先创建一个没有权限的用户在使用过grant命令来授权。
mysql> grant all on test.* to test3,test4@'localhost' identified by 'test123';query ok, 0 rows affected (0.00 sec)3、table level
table level权限可以被global level和database level权限覆盖,table level权限的作用域是授权所指定的表,可以通过如下语句来授权:
mysql> grant all on test.test1 to wolf@'%' identified by 'wolf@123';query ok, 0 rows affected (0.01 sec)mysql> show grants for wolf@'%';+-----------------------------------------------------------------------------------------------------+| grants for wolf@%|+-----------------------------------------------------------------------------------------------------+| grant usage on *.* to 'wolf'@'%' identified by password '*f693761139616215c4ac1a7c23a8b8f5b94704d1' || grant all privileges on `test`.`test1` to 'wolf'@'%'|+-----------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)table level权限由于作用域仅限于每张表,所以权限种类也比较小,只有如下8个权限,alter,create,delete,drop,index,insert,select,uodate
4、column level
