偶然在一次实验中发现MySQL权限分配何时生效的问题,当在同一台电脑(服务器)上,我用的只是一台普通PC,创建的一个普通用户user1,除测试表test1的select以外无其他权限
create user user1@localhost;
grant select on test1.* to user1@localhost;
同时用root和user1连接MySQL,如不想用图形化可在cmd命令行执行
mysql -u user1 - p test1
然后在user1用户下对某张表进行insert的操作(注意user1一直处于连接状态)
insert into test1 values('aa');
执行结果是user1无相应的权限,执行不成功
在root下为user1授权
grant insert on test1.* to user1@localhost;
flush privileges;
在user1下再次对表test1进行insert操作
这时发现,居然还是提示未有相应权限!!
然后我们user1用户退出登录后再重新登录上去,这时发现,可以作insert操作了.
因为第一次写帖还不是很熟悉发图发代码的操作,所以有兴趣的朋友可以亲自做一下我上面说的这个小测试.
下面引用一下MySQL5.1 参考手册里的一段话:
5.7.7. 权限更改何时生效
当mysqld启动时,所有授权表的内容被读进内存并且从此时生效。
当服务器注意到授权表被改变了时,现存的客户端连接有如下影响:
表和列权限在客户端的下一次请求时生效。
数据库权限改变在下一个USE db_name命令生效。
· 全局权限的改变和密码改变在下一次客户端连接时生效。
如果用GRANT、REVOKE或SET PASSWORD对授权表进行修改,服务器会注意到并立即重新将授权表载入内存。如果你手动地修改授权表(使用INSERT、UPDATE或DELETE等等),你应该执行mysqladmin flush-privileges或mysqladmin reload告诉服务器再装载授权表,否则你的更改将不会生效,除非你重启服务器。
如果你直接更改了授权表但忘记重载,重启服务器后你的更改方生效。这样可能让你迷惑为什么你的更改没有什么变化!
仔细读了一下才发现,结论很简单:
当操作对象为 *.*或xx.*(属于全局权限)时,要在下一次客户端连接时才生效,
当操作对象为xx.xx时,就能做到实时更新了,
仅从这点看来,MySQL的安全性并没有做得太好,
也不知道MySQL出于什么考虑做出了这样的设计.