一.权限表
mysql数据库中的3个权限表:user
、db、
host
权限表的存取过程是:
1)先从user表中的host、
user、
password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证;
2)通过权限验证,进行权限分配时,按照useràdbàtables_privàcolumns_priv的顺序进行分配。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,
tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
二.MySQL各种权限(共27个)
(以下操作都是以root身份登陆进行grant授权,以p1@localhost身份登陆执行各种命令。)
1.
usage
连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。
mysql>
grant
usage
on
*.*
to
‘p1′@’localhost’
identified
by
‘123′
该权限只能用于数据库登陆,不能执行任何操作;且usage权限不能被回收,也即REVOKE用户并不能删除用户。
2.
select
必须有select的权限,才可以使用select
table
mysql>
grant
select
on
pyt.*
to
‘p1′@’localhost’
mysql>
select
*
from
shop
3.
create
必须有create的权限,才可以使用create
table
mysql>
grant
create
on
pyt.*
to
‘p1′@’localhost’
4.
create
routine
必须具有create
routine的权限,才可以使用{create
|alter|drop}
{procedure|function}
mysql>
grant
create
routine
on
pyt.*
to
‘p1′@’localhost’
当授予create
routine时,自动授予EXECUTE,
ALTER
ROUTINE权限给它的创建者:
mysql>
show
grants
for
‘p1′@’localhost’
+—————————————————————————+
Grants
for
p1@localhost
+————————————————————————–+
|
GRANT
USAGE
ON
*.*
TO
‘p1′@’localhost’
IDENTIFIED
BY
PASSWORD
‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257′
|
|
GRANT
SELECT,
CREATE,
CREATE
ROUTINE
ON
`pyt`.*
TO
‘p1′@’localhost’|
|
GRANT
EXECUTE,
ALTER
ROUTINE
ON
PROCEDURE
`pyt`.`pro_shop1`
TO
‘p1′@’localhost’
|
+————————————————————————————-+
5.
create
temporary
tables(注意这里是tabl
背景
在了解动态权限之前,我们先回顾下 MySQL 的权限列表。
权限列表大体分为服务级别和表级别,列级别以及大而广的角色(也是MySQL 8.0 新增)存储程序等权限。我们看到有一个特殊的 SUPER 权限,可以做好多个操作。比如 SET 变量,在从机重新指定相关主机信息以及清理二进制日志等。那这里可以看到,SUPER 有点太过强大,导致了仅仅想实现子权限变得十分困难,比如用户只能 SET 变量,其他的都不想要。那么 MySQL 8.0 之前没法实现,权限的细分不够明确,容易让非法用户钻空子。
那么 MySQL 8.0 把权限细分为静态权限和动态权限,下面我画了两张详细的区分图,图 1 为静态权限,图 2 为动态权限。
图 1- MySQL 静态权限的权限管理图
图 2-动态权限图
那我们看到其实动态权限就是对 SUPER 权限的细分。 SUPER 权限在未来将会被废弃掉。
我们来看个简单的例子,
比如, 用户 'ytt2@localhost', 有 SUPER 权限。
mysql>show grants for ytt2@'localhost'+---------------------------------------------------------------------------------+| Grants for ytt2@localhost |+---------------------------------------------------------------------------------+| GRANT INSERT, UPDATE, DELETE, CREATE, ALTER, SUPER ON *.* TO ytt2@localhost |+---------------------------------------------------------------------------------+1 row in set (0.00 sec)
但是现在我只想这个用户有 SUPER 的子集,设置变量的权限。那么单独给这个用户赋予两个能设置系统变量的动态权限,完了把 SUPER 给拿掉。
mysql>grant session_variables_admin,system_variables_admin on *.* to ytt2@'localhost'Query OK, 0 rows affected (0.03 sec)mysql>revoke super on *.* from ytt2@'localhost'Query OK, 0 rows affected, 1 warning (0.02 sec)
我们看到这个 WARNINGS 提示 SUPER 已经废弃了。
mysql>show warnings
+---------+------+----------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------+
| Warning | 1287 | The SUPER privilege identifier is deprecated |
+---------+------+----------------------------------------------+
1 row in set (0.00 sec)`
mysql>show grants for ytt2@'localhost'
+-----------------------------------------------------------------------------------+
| Grants for ytt2@localhost |
+-----------------------------------------------------------------------------------+
| GRANT INSERT, UPDATE, DELETE, CREATE, ALTER ON *.* TO ytt2@localhost |
| GRANT SESSION_VARIABLES_ADMIN,SYSTEM_VARIABLES_ADMIN ON *.* TO ytt2@localhost |
+-----------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
当然图 2 上还有其它的动态权限,这里就不做特别说明了。
1、创建新用户通过root用户登录之后创建
>>grant all privileges on *.* to testuser@localhost identified by "123456" //创建新用户,用户名为testuser,密码为123456 ;
>>grant all privileges on *.* to testuser@localhost identified by "123456" //设置用户testuser,可以在本地访问mysql
>>grant all privileges on *.* to testuser@"%" identified by "123456" //设置用户testuser,可以在远程访问mysql
>>flush privileges //mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问,还有一种方法,就是重新启动mysql服务器,来使新设置生效
2、设置用户访问数据库权限
>>grant all privileges on test_db.* to testuser@localhost identified by "123456" //设置用户testuser,只能访问数据库test_db,其他数据库均不能访问 ;
>>grant all privileges on *.* to testuser@localhost identified by "123456" //设置用户testuser,可以访问mysql上的所有数据库 ;
>>grant all privileges on test_db.user_infor to testuser@localhost identified by "123456" //设置用户testuser,只能访问数据库test_db的表user_infor,数据库中的其他表均不能访问 ;
3、设置用户操作权限
>>grant all privileges on *.* to testuser@localhost identified by "123456" WITH GRANT OPTION //设置用户testuser,拥有所有的操作权限,也就是管理员 ;
>>grant select on *.* to testuser@localhost identified by "123456" WITH GRANT OPTION //设置用户testuser,只拥有【查询】操作权限 ;
>>grant select,insert on *.* to testuser@localhost identified by "123456" //设置用户testuser,只拥有【查询\插入】操作权限 ;
>>grant select,insert,update,delete on *.* to testuser@localhost identified by "123456" //设置用户testuser,只拥有【查询\插入】操作权限 ;
>>REVOKE select,insert ON what FROM testuser//取消用户testuser的【查询\插入】操作权限 ;
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)