现在的位置: 首页 > 数据库 > 正文

mysql 权限控制详解

2019年06月10日 数据库 ⁄ 共 2336字 ⁄ 字号 评论关闭

概述

mysql权限控制在不同的上下文和不同的操作水平上都可以进行控制,他们包括如下几个
** 管理权限可以允许用户管理mysql server的操作。这些权限控制是全局的,不是针对某个特定的数据库的
** 数据库权限对应到一个数据库和里面的对象。这些权限被用来控制特定的数据库或者全局的,他们能够应用到所有的数据库
** 数据库对象的权限对应到数据库表,索引,视图,和存储过程,可以对数据库内部的某个对象进行授权控制。

权限的存储位置

** 账号权限信息被存储在mysql数据库的user,db,tables_priv ,columns_priv ,procs_priv 表中。
** mysql启动的时候读取这些信息到内存中去,或者在权限变更生效的时候,重新读取到内存中去

mysql 账号管理

mysql 账号名字由用户名和主机名组成。这样可以允许同已用户在不同主机上分别控制权限。这一部分描述如何分配账户名字包括特定的值和模糊
匹配规则,在sql语句中,create user, grant ,set password的时候,会用到这些规则:
- ‘user_name’@’host_name’ 就是账户名字的语法规则
- 仅仅包含用户名的账号等同于 ‘username’@’%’
- 如果用户名是合法的字符,用户名和主机名不必用引号引起来。在你的用户名包含’-‘这样的字符的时候,需要用引号引起来。或者说主机名有
通配符的时候需要引起来。
- 引号可以用单引号也可以用双引号。
- 主机和用户名必须分别被引号括起来,如果必须要括的话。
mysql在mysql数据库中分别用两个列去存储用户名和主机名:
- 用户表每个账户一行记录,此表也表示了账号有哪些全局权限。
- 其他授权表表示了账号拥有的数据库和数据库内的对象。这些表都有用户名和主机列。每行的账户信息和user表的账户信息是奕扬的。
用户名和主机名可以包含特殊字符或者通配符,下面是这些规则:
用户名要么是一个非空字符串字面上必须匹配连接字符串中指名的用户名,或者一个空字符串就会匹配人户用户名。空用户名是一个匿名用户。
主机名也可以又好多形式,或者通配符:
- 主机名可以是一个IP地址或者一个localhost样的字符串。
- %和sql中的like的效果是一样的。例如 ’%.mysql.com’ 就会匹配 a.mysql.com.

权限控制阶段1:连接校验

当你尝试去连接到mysql服务器,服务器基于下面两点条件去接受或者拒绝连接:
- 你的身份标识以及正确的密码
- 你的账号是否被锁定了
服务器先校验密码是否正确,然后校验是否锁定。任何一个步骤失败,服务器将会拒绝连接。如果通过校验,服务器接受连接,然后进入第二阶段并且等候请求。
认证检查先检查user表的三个列,host,user,password。锁定状态是在user表的account_locked列中记录着的。账号锁定状态可以通过alter user语句来变更。
你的身份由两部分来组成,你连接的客户主机以及你的mysql用户名。如果用户名不空,则必须全字符匹配才可以,如果用户名是空的,则匹配任何用户。如果用户表匹配到一个空用户名,这个用户被认为是一个匿名用户,二不是客户实际提供的。这意味着空用户名是用来进一步检查用的也就是阶段2.
密码可以为空,这个不是一个通配符,不意味着匹配任何密码。它的意思是用户必须无密码连接。如果服务起授权一个客户都安使用一个插件,这样
该插件实现的认证体系或许没有用密码列。在这样的情况下,外部密码也可以用来去认证mysql服务器。
非空密码都是加密存储的,mysql没有存储任何明文密码。并且用户提供的密码也是被加密的。这个加密的密码后来在连接过程中,来检查密码是否正确。
从mysql的观点来看,加密的密码才是真正的密码,所以不要告诉任何人这个加密的密码。
如果在user表中有多行被匹配,服务器必须决定用哪一个,它的规则是这样的:
- 任何时候服务器读取用户表到内存中的时候,它会排序。
- 服务器检查的伺候服务器按行顺序去检查
- 服务器使用第一个匹配的行
服务器排序的规则是无通配符的在前面,统配的在后面。

权限控制阶段2:请求校验

当通过了连接校验,你和服务器建立了连接后,服务器进入权限控制的第二个阶段。你的每个请求,服务器决定出你想做什么操作,然后检查你是否有
权限去做。此时,grant 表的privilege列就该出场了。这些列可以出自 user,db,tables_priv,columns_priv,procs_priv。不再细讲这些表了。

什么时候去权限变更生效

当服务器启动的时候,grant表的数据被读入内存。如果你使用账户管理语句去更新权限控制,服务器将会知道这些变更,然后重新读取它们。如果你
直接用sql语句去更新这些表,你的变更不会生效,直到你重新启动服务器或者你告诉服务器去重建缓存。
你可以通过执行一个刷新权限操作来通知服务器重建缓存。下面三个语句都可以达到效果:
- flush_privileges
- mysqladmin_flush-privileges
- mysqladmin_reload
如果启动参数是 –skip-grant-tables ,那么服务器不再校验任何权限,很不安全。

抱歉!评论已关闭.