MySQL 权限机制和权限存储

2015-10-18 1 By admin

一、MySQL 权限管理机制

MySQL 数据库的用户使用host和user字段进行标识,用户的权限由权限级别和具体权限组成。权限级别为权限设定的具体对象,分为数据库、数据表、字段等。具体权限可以有读取、写入等。

1.1、标识一个用户

MySQL 用户信息存储在user表中。这个表除了存储用户名,主机和密码外;就是存储一些权限信息了。
这个表的主键是由host和user组成的组合索引。可以看出MySQL标识用户是结合host和user两个字段来处理的。

1.2、权限的组成

用户的权限由权限级别和具体权限这两部分组成。如:某个数据表的插入权限;某个数据表的读取权限。
具体权限:’插入’和’读取’;
权限级别:tables 和 databases;

1.3、权限级别

权限级别分为:库级别、表级别、字段级别、管理级别、程序级别。权限级别划分需要根据的场景进行设置。
1、数据权限上分为:库、表和字段三种级别。对数据权限的管理已经足够了。
2、管理权限主要是管理员要使用到的权限,包括:数据库创建,临时表创建、主从部署、进程管理等
3、程序级别主要是触发器、存储过程、函数等权限。

1.4、具体权限的分布

不同的权限级别上可以设置的权限存在差异。

权限级别 可以分配的权限
表权限 ‘select’, ‘insert’, ‘update’, ‘delete’, ‘create’, ‘drop’, ‘grant’, ‘references’, ‘index’, ‘alter’
列权限 ‘select’, ‘insert’, ‘update’, ‘references’
过程权限 ‘execute’, ‘alter routine’, ‘grant’

1.5、具体权限列表

具体权限和权限级别的不同组合说明。

具体权限 权限级别 权限说明
create 数据库、表或索引 创建数据库、表或索引权限
drop 数据库或表 删除数据库或表权限
grant option 数据库、表或保存的程序 赋予权限选项
references 数据库或表
alter 更改表,比如添加字段、索引等
delete 删除数据权限
index 索引权限
insert 插入权限
select 查询权限
update 更新权限
create view 视图 创建视图权限
show view 视图 查看视图权限
alter routine 存储过程 更改存储过程权限
create routine 存储过程 创建存储过程权限
execute 存储过程 执行存储过程权限
file 服务器主机上的文件访问 文件访问权限
create temporary tables 服务器管理 创建临时表权限
lock tables 服务器管理 锁表权限
create user 服务器管理 创建用户权限
process 服务器管理 查看进程权限
reload 服务器管理 执行flush-hosts, flush-logs,
flush-privileges, flush-status,
flush-tables, flush-threads,
refresh, reload等命令的权限
replication client 服务器管理 复制权限
replication slave 服务器管理 复制权限
show databases 服务器管理 查看数据库权限
shutdown 服务器管理 关闭数据库权限
super 服务器管理 执行kill线程权限

二、权限数据的存储方式

权限管理的数据存储在MySQL库中的几张表中。如下:user、db、tables_priv、columns_priv、procs_priv、proxies_priv。

2.1、User表说明

A、user表的用户列
user数据表包括Host、User、Password,分别表示主机名、用户名和密码。
Host和User列为user表的联合主键,当用户与服务器建立连接时,输入的用户名、主机名和密码必须匹配user表中对应的字段,只有这三个值,都匹配的时候,才允许建立连接。
当修改密码时,只需要修改user表中Password字段的值。
B、权限列
user表的权限列,包括Select_priv、Insert_priv、Update_priv等,以priv结尾的字段,这些字段决定了用户的权限;其中,包括查询权限、修改权限、关闭服务等权限。
user表对应的权限,是针对所有数据库的,并且,这些权限列的数据类型都是ENUM,取值只有N和Y。
C、安全列
user表的安全列,用于管理用户的安全信息,其中,包括6个字段
1、ssl_type和ssl_cipher,用于加密
2、x509_issuer和x509_subject标准,可以用来标识用户
3、plugin和authentication_string,用于存储和授权相关的插件
通常,标准的发行版不支持ssl加密,可以使用SHOW VARIABLES LIKE ‘have_openssl’语句查看,如果have_openssl的取值为DISABLED,则表示不支持加密。
D、资源控制列
user表的资源控制列,用于限制用户使用的资源;其中包括4个字段:
1、max_questions,每小时允许用户,执行查询操作的次数
2、max_updates,每小时允许用户,执行更新操作的次数
3、max_connections,每小时允许用户,建立连接的次数
4、max_user_connections,允许单个用户,同时建立连接的次数

2.2、db表说明

db表存储了用户对某个数据库的操作权限,决定用户能从哪个主机存储哪个数据库。

2.3、tables_priv表 和 columns_priv表

和db表相似,当对表或者字段设置权限时,会将权限存储在这两张表里。

2.4、procs_priv表

存储过程和存储函数相关的权限,分别是Host、Db、User、Routine_name、Routine_type、Grantor、Proc_priv和Timestamp,各个字段的说明如下:
1) Host、Db和User字段分别表示主机名、数据库名和用户名。Routine_name表示存储过程或函数的名称。
2) Routine_type表示存储过程或函数的类型。
3) Routine_type字段有两个值,分别是FUNCTION和PROCEDURE。FUNCTION表示这是一个函数;PROCEDURE表示这是一个存储过程。
4) Grantor是插入或修改该记录的用户。
5) Proc_priv表示拥有的权限,包括Execute、Alter Routine、Grant这3种。
6) Timestamp表示记录更新时间。