mysql 开发进阶篇系列 51 权限与安全(权限表user,db详细介绍 )
一.概述
mysql 的权限系统主要用来对连接到数据库的用户进行权限验证,以此来判断此用户是否属于合法用户,以及合法用户给予的相应数据库权限。下面将介绍权限系统的工作原理,以及将要熟练掌握账号的管理和使用方法(mysql版本 5.7)。
1.1 权限系统的工作原理
mysql 权限系统通过两个阶段进行认证:(1) 对连接的用户进行身份认证,合法的用户通过认证,不合法的用户拒绝连接;(2) 对通过认证的合法用户赋予相应的权限,用户可以在这些权限范围内对数据库做相应操作。
对于身份认证, mysql是通过ip地址和用户名联合进行确认的, 例如在mysql安装后默认创建的用户root@localhost表示用户root 只能从本地(localhost)进行连接才可以通过认证,此用户从其它任何主机上对数据库进行的连接都将被拒绝。 可以说同样一个用户名,如果来自不同的ip地址,则mysql将视为不同的用户。
如下图所示,mysql.user表中第一行的host列限定是localhost 代表本地:
mysql权限表在数据库启动的时候就载入内存了,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。
1.2 权限表的权限介绍
在权限表存取的两个过程中,系统会用到"mysql" 数据库(安装mysql时被创建, 数据库名称叫" mysql ")中的user,host,db这3个最重要的权限表(在mysql 5.6.7中删除了mysql.host表)。
表名 | user | db | 描述 |
用户列 | host | host | 允许用户登录所使用的ip |
user(对应的用户名称) | db(对应的库名称) | ||
password (5.7 版本 authentication_string) |
user | ||
权限列 | |||
select_priv | select_priv | 是否通过select命令查询数据 | |
insert_priv | insert_priv | 是否通过insert命令插入数据; | |
update_priv | update_priv | 是否通过update命令修改现有数据 | |
delete_priv | delete_priv | 是否通过delete命令删除现有数据 | |
create_priv | create_priv | 是否可以创建新的数据库和表 | |
drop_priv | drop_priv | 是否可以删除现有数据库和表 | |
reload_priv | 是否可以执行刷新和重新加载mysql所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表;重新加载权限表 | ||
shutdown_priv | 是否可以关闭mysql服务器 | ||
process_priv | 是否可以通过show processlist命令查看其他用户的进程;服务器管理 | ||
file_priv | 是否可以执行select into outfile和load data infile命令;加载服务器上的文件 | ||
grant_priv | grant_priv | 是否可以将自己的权限再授予其他用户 | |
references_priv | references_priv | 创建外键约束 | |
index_priv | index_priv | 是否可以创建和删除表索引;用索引查询表 | |
alter_priv | alter_priv | 是否可以重命名和修改表结构 | |
show_db_priv | 是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库 | ||
super_priv | 是否可以执行某些强大的管理功能,例如通过kill命令删除用户进程,使用set global修改全局mysql变量,执行关于复制和日志的各种命令;超级权限 | ||
create_tmp_table_priv | create_tmp_table_priv | 是否可以创建临时表 | |
lock_tables_priv | lock_tables_priv | 是否可以使用lock tables命令阻止对表的访问/修改; | |
execute_priv | execute_priv | 是否可以执行存储过程 | |
repl_slave_priv | 是否可以读取用于维护复制数据库环境的二进制日志文件;此用户位于主系统中,有利于主机和客户机之间的通信;主服务器管理 | ||
repl_client_priv | 是否可以确定复制从服务器和主服务器的位置;从服务器管理 | ||
create_view_priv | create_view_priv | 是否可以创建视图 | |
show_view_priv | show_view_priv | 是否可以查看视图 | |
create_routine_priv | create_routine_priv | 是否可以更改或放弃存储过程和函数 | |
alter_routine_priv | alter_routine_priv | 是否可以修改或删除存储函数及函数 | |
create_user_priv | 是否可以执行create user命令,这个命令用于创建新的mysql账户 | ||
event_priv | event_priv | 是否能否创建、修改和删除事件 | |
trigger_priv | trigger_priv | 是否能否创建和删除触发器 | |
create_tablespace_priv | 是否可以创建表空间 | ||
安全列 | |||
ssl_type | 支持ssl标准加密安全字段 | ||
ssl_cipher | 支持ssl标准加密安全字段 | ||
x509_issuer | 支持x509标准字段 | ||
x509_subject | 支持x509标准字段 | ||
资源控制列 | |||
max_questions | 每小时允许执行多少次查询 | ||
max_updates | 每小时可以执行多少次更新 | ||
max_connections | 每小时可以建立的多少次连接 | ||
max_user_connections | 单用户可以同时具有的连接数 | ||
安全列 | |||
plugin | 引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户 | ||
password_expired | 密码是否过期 (y 已过期) | ||
password_last_changed | |||
password_lifetime | |||
account_locked |
在这二个表中,最重要的是user表,其次是db表,在user表中通常使用最多的是用户列和权限列, 权限列分为普通权限和管理权限。
普通权限主要用于数据库操作,如seelct_priv,create_priv等。
管理权限主要用来对数据库进行管理的操作包括:create_tablespace_priv ,create_user_priv ,process_priv,
reload_priv, repl_client_priv , repl_slave_priv , show_db_priv ,shutdown_priv ,super_priv。
最后权限表中权限列,对应的权限名(privilege)如下图所示(在下一章中有用grant赋予权限时会用到,例如权限列delete_priv对应的是delete权限):
详细的权限文档参考:
下一篇: Redis的安装与配置