Mysql的认证采用账号密码方式,其中账号由两个部分组成:Host和User;Host为允许登录的客户端Ip,User为当前登录的用户名。
授权没有采用典型的RBAC(基于角色的访问控制),而是每个用户关联一个资源权限列表。
认证信息存放在mysql.user表中,其中还包含了用户的全局权限。
授权信息主要存放在mysql.*_priv系列表中,提供了数据库,表,行等各个粒度的权限控制。
本文使用的Mysql版本为5.7.24。
认证用户认证信息存放在mysql.user表中,每条记录为一个用户,(Host,User)为唯一索引,除此之外还有用户全局权限和一些控制数据如密码过期时间等。
可以像操作普通表一样修改user表数据,但是密码字段需要额外的命令修改。
新增用户创建用户同时设置密码:CREATE USER \'userName\'@\'host\' IDENTIFIED BY \'password\'
创建用户但是不设置密码:CREATE USER \'userName\'
认证信息四元组为:host,userName,pwd,authentication_string。
(host,userName)受唯一索引约束,两者共同标识唯一用户。
host为当前用户登录的终端主机ip,支持通配符_和%;通配符使用规则和like模糊匹配中用法一致。不限制登录终端ip设为%。
HOST的形式:1. IP地址,如172.16.16.1;2. 主机名,如localhost;3. 网络地址,如172.16.0._ 允许的host区间为172.16.0.1-172.16.0.9
删除用户直接删除user表记录:Delete FROM user Where User=\'test\' and Host=\'localhost\';
使用drop命令:drop user \'jack\'@\'localhost\';
修改密码用户密码使用密文保存,散列后存在user表中。可以用password(\'passwd\')函数来生成密文密码。
直接操作数据库:set authentication_string=password(\'plaintext_password\') where User = \'userNmae\' and Host = \'host\'
使用修改密码命令:SET PASSWORD FOR \'fred\'@\'localhost\' = \'plaintext_password\';
用户重命名rename user \'jack\'@\'%\' to \'jim\'@\'%\';
授权授权检查流程 :
第一阶段:服务器首先会检查你是否允许连接。因为创建用户的时候会加上主机限制,可以限制成本地、某个IP、某个IP段、以及任何地方等,只允许你从配置的指定地方登陆。
第二阶段:如果你能连接,Mysql会检查你发出的每个请求,看你是否有足够的权限实施它。比如你要更新某个表、或者查询某个表,Mysql会查看你对哪个表或者某个列是否有权限。再比如,你要运行某个存储过程,Mysql会检查你对存储过程是否有执行权限等
用户授权信息分为两部分:全局授权在user表中,各个类型数据库对象的授权在db、tables_priv、columns_priv等表中。
表 说明 详细user 用户的全局权限 该表决定是否允许用户连接到服务器。如果允许连接,权限字段则为该用户的全局权限
db 用户对数据的权限 用于决定哪些用户可以从哪些主机访问哪些数据库。包含在db表中的权限适用于这个表标识的数据库
tables_priv 用户对数据表的权限 该表与db表相似,不同之处是它用于表而不是数据库。这个表还包含一个其他字段类型,包括timestamp和grantor两个字段,用于存储时间戳和授权方。在本文后面我们会对这个表做进一步的讲解
columns_priv 用户对数据列的权限 该表作用几乎与db和tables_priv表一样,不同之处是它提供的是针对某些表的特定列的权限
权限表的处理过程
先从user表中的host、 user、 password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证。
通过权限验证,进行权限分配时,按照user、db、tables_priv、columns_priv的顺序进行分配。即先检查全局权限表 user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检 查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
grant授权语句grant all privileges on db.table to \'fred\'@\'localhost\'
ALL PRIVILEGES 是表示所有权限,你也可以使用select、update等权限,见下文权限类型。
ON 用来指定权限针对哪些库和表。
. 中前面的号用来指定数据库名,后面的号用来指定表名。
TO 表示将权限赋予某个用户。
jack@\'localhost\' 表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。