User Rights Management

MySQL的用户权限管理即通过划分用户,为不同用户在dbms中提供不同的权力。MySQL服务器通过权限表来控制用户对数据库的操作,权限表存放在mysql数据库中,由mysql_install_db脚本初始化。
存储账户权限信息表(在dbms中一个名为mysql的数据库中存储)主要有:user、db、tables_priv、columns_priv、procs_priv、proxies_priv这六张表(5.6之前还有host表,现在已经把host内容整合进user表)

有哪些权限

MySQL中的用户权限包括连接权限和操作权限两大部分。

连接权限

连接权限用于设置用户是否有权登录到dbms中,权限信息(字段)包括host(从哪来)、user(用户名)及password(密码),保存于user表中。

操作权限

mysql对用户的操作权限信息保存在名为mysql的数据库的如下六个表中:user、db、tables_priv、columns_priv、proce_priv、proxies_priv。每一个表都记录的每个用户的各类操作权限(如查询、修改、删除等权限)。
下面是各个表的具体权限分类。

  • user表:user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。
  • db表:db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。
  • tables_priv表:tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。
  • columns_priv表:columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。
  • proce_priv:columns_priv表指定存储过程权限。这里代表允许使用某个存储过程的权限。
  • proxies_priv:利用 MySQL proxies_priv(模拟角色)实现类似用户组管理。角色(Role)可以用来批量管理用户,同一个角色下的用户,拥有相同的权限。

注意,某一用户登录dbms后要进行某一操作时,其权限检查按上述表顺序由上至下依次检查,当在某一表中权限检查通过,直接执行操作而不用继续检查。

实际操作

在MySQL中对用户权限进行创建、修改和删除时,均可以直接使用DML在上述权限表中进行操作。
另外MySQL也提供了一些命令,可以使用户在MySQL终端中修改用户权限,避免了用户直接修改系统数据库,主要命令如下:

  • 创建用户:create user [用户名]@[访问地址] identified by [密码];
    • 当访问地址为%时表示不限制访问host
  • 授予权限:grant [权限1,权限2,权限3] on *.* to user@'host' identified by 'password';
    • all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等
    • on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user
    • to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:‘zhangsan‘@’192.168.1.%’,表示zhangsan这个用户只能在192.168.0.* IP段登录
    • with grant option:通过在grant语句的最后使用该子句,就允许被授权的用户把得到的权限继续授给其它用户
  • 修改权限
    • 收回权限:revoke [权限] ON *.* FROM admin@'localhost';
    • 删除用户:drop user admin@'localhost';

注意,每次进行权限的授予和修改后,要及时刷新权限:flush privileges;