一文读懂MySQL权限系统
发布时间:2022-10-15 11:03:18 所属栏目:MySql教程 来源:
导读: MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE权限。附加的功能包括有匿名的用户并对于MySQL特定的功能例如LOAD DATA INFILE进行授权及管
MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE权限。附加的功能包括有匿名的用户并对于MySQL特定的功能例如LOAD DATA INFILE进行授权及管理操作的能力。 mysql赋权限操作: 谈到mysql权限,在工作中第一个想到的就是给用户设置允许外部连接的权限,因为要使用类似navicat的图形化工具,更加方便更加简便快捷的操作数据库。操作也很简单以root用户为例,分三个步骤,分别是: 1、设置mysql数据库中user表host字段为%,如下图 mysql系统_mac 系统不支持 mysql_分布式mysql集群系统 2、赋予root 用户权限 grant allprivileges on *.* to ‘root’@’%’ with grant option 3、刷新 flush privileges; 做完这些,就可以使用图形化工具连接mysql了。 但是今天同事在安装的时候出现了一个问题,就是安装过后,不用上面的操作依然可以连接,按道理来讲肯定是行不通的,这简直颠覆了信仰......所以怀疑是不是有缓存什么的,所以又是一顿刷新缓存,重启服务。 但结果仍然可以正常链接,折腾了半天才发现原来配置文件中有这么一句配置: mysql系统_mac 系统不支持 mysql_分布式mysql集群系统 "取消密码验证" 第一想法感觉只是取消了密码验证而已,和用户的远程连接应该没关系,但是结果很意外,于是关闭又开启这个配置后果然,外部链接的权限也跟着关闭和开启。 为了进一步搞清楚问题所在,查询了mysql的官方文档(文档是真心乱)发现原来skip-grant-tables 不是取消密码验证的意思,官网解释如下: 于是才知道skip-grant-tables 是关闭mysql的权限系统~~~不单单是密码验证,因为根本需要验证了。 mysql权限系统工作思路: 那么mysql的权限系统到底是怎么工作的?下面也整理了一些个人的理解。mysql对于权限的控制分为两个阶段。 阶段1、服务器检查是否允许你连接。 阶段2:假定你能连接,服务器检查你的操作权限。 流程图很清楚的解释了权限体系的流程mysql在定义权限的时候是跟你用户名和网络地址来形成权限集的,就是说允许tom从不同的主机拥有不同的mysql权限,换句话说,就是不同主机的tom可能不是同一个人,所以就不能拥有同一个权限集了。 而权限集的表主要由MySQL库中 user,db ,host三张表组成。 表名 user db host 列范围 Host Host Host User Db Db Password User 1、user 表范围列决定是否允许或拒绝到来的连接。对于允许的连接,user表授予的权限指出用户的全局(超级用户)权限。这些权限适用于服务器上的all数据库。 2、db 表范围列决定用户能从哪个主机存取哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。 3、host表不受GRANT和REVOKE语句的影响。大多数MySQL安装根本不需要使用该表。 4、tables_priv和columns_priv表可以对表和列提供更精确的权限控制。 举个例子,user表中host为192.168.0.1 user为 lisi ,db表中同样会存有 host为192.168.0.1 user为 lisi 的记录,Db的值则为该用户可以操作的数据库,至此最上面设置mysql数据库中user表host字段为%的操作就很好理解了,就是允许所有的root用户以所有ip连接mysql服务。 当用户有权限连接到mysql后,会从内存中加载到上述几个表中的权限集,进行权限控制,如果更新了某个用户的权限,则需要刷新缓存也就是最上面将的第三步。 最后说下第二步操作 grant all privileges on *.* to ‘root’@’%’ with grant option ;整条语句唯一需要解释的就是*.* 这一处,这一处代表的是操作的层级,通俗的讲就是权限在表层级,字段层级,还是库的层级mysql系统,那么层级可以具体划分如下: 层级 范围 所在位置 授予语法 撤销语法 全局层级 所有数据库 mysql.user GRANT ALL ON *.* REVOKE ALL ON *.* 数据库层级 指定数据库 mysql.db和mysql.host GRANT ALL ONdb_name.* REVOKE ALL ONdb_name.* 表层级 给定表中的所有列 mysql.talbes_priv GRANT ALL ONdb_name.tbl_name REVOKE ALL ONdb_name.tbl_name 列层级 给定表中的单一列 mysql.columns_priv GRANT ALL ONdb_name.tbl_name.col REVOKE ALL ONdb_name.tbl_name.clo 子程序层级 一个已存储的函数或一个已存储的过程时 总结: 在使用数据库的时候,对赋予用户的权限一定要细致和慎重,不建议用%和*.*来给与普通用户操作,同样对root用户也是如此。毕竟数据的安全是很重要的。 (编辑:开发网_新乡站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐