一、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表示记录更新时间。
转至:https://cn-blogs.cn/archives/2963.html