Mysql权限
用户做权限控制,分两个阶段:
第一个阶段用户能不能登录到mysql
第二个阶段是登录到mysql来拥有什么权限
两个阶段分别查看不一样的表,权限全部都记录在表里面。
Mysql里面用户的权限,先判断是不是root账户,如果是root账户就没得说,什么权限都有。
拿什么当依据?
四张表:user db (5.1/5.5版本有host表) tables_priv columns_priv
但是从5.5之后,比如5.7host表就没用了。用user db tables_priv columns_priv这四张表做权限控制。这四张表对应的权限是由范围最大到最小。
比如现在有账户tom,tom在登录的时候,第一件事就去user表找一找有没有你这个账户,如果有这个账户就让你登录,如果没这个账户,就连登录都登录不了。只有登录进去之后,才会进入第二个阶段,判断有什么样的权限。第二个阶段,第一张看的表还是user,要看user表里的select权限是不是Y。如果在user表里的权限是Y,后面的表都不用看了,你对所有的库,所有的表都会拥有select权限,这个权限范围是最大的。如果select权限不是Y那就是N。这里写的N不代表没有select权限,你的权限不是最大范围的权限,要把范围缩小一点,看是不是对msyql里边其中一个库或几个库有权限。这时候去查db表了,去看你是不是对某一个独立的单独的库有权限,比如你对db1这个库有select权限Y。虽然不是对所有的库里边所有的表都有select权限,但是我对其中某一个库有这个权限,这个库是说的库里边所有的表。假如在这个db表里我的权限也是N。这也不代表我什么权限都没有,那我把范围在缩小一点。
我再去查看tables_priv,这张表记录的是你是不是对某一张表有权限,范围是越来越小了。刚开始user表记录的权限是最大的权限,它的范围涉及到整个msyql里边所有的库,所有的表,如果是N,就看db,很明显是库的意思,那我看你是不是对某一个库有权限,现在连整个库都管不了,那我就看看某一个库里的某一张表,你是不是有权限,这时候它去看tables_priv这张表,他看这张表里面你是不是对某一张表有权限,如果有肯定是有select权限的Y,如果这里是Y,代表的你对我这张表是可以查看所有的字段所有的记录。如果在这里也没权限。最后他要去看columns_priv,看看你是不是对某一张表里的某一列有权限,你连查看某一列的权限都没有,我就判定你只能登录。啥也干不了,什么权限都没有。
总结 先看看你是不是有大范围的权限,没有的话我把范围缩小一点到库,如果没有再缩小到表,再没有缩小到列,缩小到字段,如果连字段的权限都没有,那你就什么权限都没有。
四张表:user db tables_priv columns_priv
1.用户认证
查看mysql.user表, 只看user表user表有,能登录,没有不能,假装能登录才会进入第二阶段。
2.权限认证
以select权限为例:其他权限都一样
先看 user表里的select_priv权限值是Y还是N
Y 如果是Y,代表着对所有库里边的所有表都有select权限,就不用再往下检查,权限检查过程就结束了。
N 只有在select是N的情况下,才会接着看db表
db
Y 不会接着查看其他的表 拥有查看所有库所有表的权限
N 接着看tables_priv表
tables_priv
table_priv: 如果这个字段的值里包括select 拥有查看这张表所有
字段的权限,不会再接着往下看了
table_priv:如果这个字段的值里不包括select,接着查看下张表
还需要有column_priv字段权限
columns_priv
column_priv: 有select,则只对某一列有select权限
没有则对所有库所有表没有任何权限
验证第一步 select
创建一个tim账户,在不创建的时候肯定不能登录,有了账户是可以登录了。但是什么权限都没有,任何有用的东西都看不到。它就没有select权限。
select * from mysql.user\G 找到tim,它的select权限是N。在root用户
再打开一个终端 mysql -u tim 登录进去
然后show databases; 啥权限都没有
_
去改select_priv的值,在root用户
直接修改表的内容一定要flush privileges;刷新权限
去另一个终端,退出去重新登录一下,重新show就看见mysql了。use mysql;也进去了,show tables;也能看,里面任何一张表也能看,比如select * from user\G也能看。
但是改不了,跟修改有关的操作都做不了。
比如创建一张表,没有权限,不属于select权限,因为刚才的授权只做了select的授权
现在去观察授权,发现select变成Y。说明jim这个账户在所有的库所有的表都拥有select权限。
验证第二步db
首先得把select_priv Y改成 N,之后再去观察db表长什么样子。
创建db1库,db2库,创建了两个表,两个表里都会有一条记录。
需要去添加host,db,user,select_priv字段,需要添加一条记录。这个权限表明jim账户从本地登录的时候,只能操作db1这个库里所有的表,其他的库它还是看不了。
host(从哪台机器可以登录)
db 指定它能操作哪个库,比如db1
user 哪个账户 jim
select_priv 权限是Y,user表里的改成N
flush privileges;刷新权限
测试
能看见db1了,db2根本看不了,因为只授了db1的权限给它,
use db1;里面的表都能看得见,也能select,但是它没有插入权限,也操作不了其他的库。
在测试之前,一定要观察一下表里的字段,因为都长得不一样。
比如tables_priv这张表要添加记录就要添加这些。tables_priv:select 要给他权限
desc mysql.columns_priv
插入这条记录,要有6个数据。从哪台机器可以登录到哪个库,使用的哪个账户,它能操作哪个表里面的哪个列,对列拥有的是什么权限,如果只想给它select权限就给它select,而且它是用的set类型的。set可以从这里面选多个,可以同时给它设置多个权限。
查看权限 (可以直接查看表,可以不用这些命令)
看自己的权限:SHOW GRANTS\G
看别人的权限:SHOW GRANTS FOR admin1@'%'\G
撤销权限:revoke简单一点,也可以直接修改表,
语法:REVOKE 权限列表 ON 数据库名 FROM 用户名@‘客户端主机’
例如:
mysql> revoke all on *.* from 'xiaowu'@'%'; 撤销xiaowu的权限
(all是撤销什么权限 *.*哪张库哪张表里的权限)这种方法是撤销某一个权限,比如它拥有所有的权限,我只撤销它的删除权限,就用这种方法
mysql> revoke delete on *.* from admin1@’%’; //回收部分权限
(这种方法是撤销某一个权限,比如它拥有所有的权限,我只撤销它的删除权限,就用这种方法)
REVOKE ALL PRIVILEGES ON *.* FROM admin2@’%’; //回收所有权限
REVOKE ALL PRIVILEGES,GRANT OPTION ON *.* FROM 'admin2'@'%';
刷新权限
方式1:
mysql > flush privileges;
方式2:
# mysqladmin flush-privileges -u root -p1