| 表名 | user | db | 
|---|---|---|
| 范围列 | Host | Host | 
| User | Db | |
| User | ||
| 权限列 | Select_priv | Select_priv | 
| Insert_priv | Insert_priv | |
| Update_priv | Update_priv | |
| Delete_priv | Delete_priv | |
| Index_priv | Index_priv | |
| Alter_priv | Alter_priv | |
| Create_priv | Create_priv | |
| Drop_priv | Drop_priv | |
| Grant_priv | Grant_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 | |
| Execute_priv | Execute_priv | |
| Trigger_priv | Trigger_priv | |
| Event_priv | Event_priv | |
| Create_tmp_table_priv | Create_tmp_table_priv | |
| Lock_tables_priv | Lock_tables_priv | |
| References_priv | References_priv | |
| Reload_priv | ||
| Shutdown_priv | ||
| Process_priv | ||
| File_priv | ||
| Show_db_priv | ||
| Super_priv | ||
| Repl_slave_priv | ||
| Repl_client_priv | ||
| Create_user_priv | ||
| Create_tablespace_priv | ||
| 安全专栏 | ssl_type | |
| ssl_cipher | ||
| x509_issuer | ||
| x509_subject | ||
| plugin | ||
| authentication_string | ||
| password_expired | ||
| password_last_changed | ||
| password_lifetime | ||
| account_locked | ||
| 资源控制列 | max_questions | |
| max_updates | ||
| max_connections | ||
| max_user_connections | 
User权限表结构中的特殊字段:
此数值自动更新Account_locked代表此用户被锁住,无法使用在mysql 5.7 以前在user表有password 这个字段。
2.1.2 Tables_priv和columns_priv权限表结构
| 表名 | tables_priv | columns_priv | 
|---|---|---|
| 范围列 | Host | Host | 
| Db | Db | |
| User | User | |
| Table_name | Table_name | |
| Column_name | ||
| 权限列 | Table_priv | Column_priv | 
| Column_priv | ||
| 其他列 | Timestamp | Timestamp | 
| Grantor | 
Tables_priv和columns_priv权限值
| Table Name | Column Name | Possible Set Elements | 
|---|---|---|
| tables_priv | Table_priv | 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter', 'Create View', 'Show view', 'Trigger' | 
| tables_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' | 
| columns_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' | 
| procs_priv | Proc_priv | 'Execute', 'Alter Routine', 'Grant' | 
2.1.3 procs_priv权限表结构
| Table Name | procs_priv | 
|---|---|
| Scope columns | Host | 
| Db | |
| User | |
| Routine_name | |
| Routine_type | |
| Privilege columns | Proc_priv | 
| Other columns | Timestamp | 
| Grantor | 
系统权限表字段长度限制表
| Column Name | Maximum Permitted Characters | 
|---|---|
| Host,Proxied_host | 60 | 
| User,Proxied_user | 32 | 
| Password | 41 | 
| Db | 64 | 
| Table_name | 64 | 
| Column_name | 64 | 
| Routine_name | 64 | 
权限认证中的大小写敏感问题
2.2.1 查看用户权限信息
查看MYSQL有哪些用户
mysql> select user,host from mysql.user;
查看已经授权给用户的权限信息
例如root
mysql> show grants for root@'localhost';
查看用户的其他非授权信息
mysql> show create user root@'localhost';

2.2.2 用户组成
MySQL的授权用户由两部分组成:用户名和登录主机名
包含特殊字符则是必须的%和_两个匹配字符,比如'%'代表所有主机, '%.mysql.com'代表来自mysql.com这个域名下的所有主机, ‘192.168.1.%'代表所有来自192.168.1网段的主机
| User值 | Host 值 | 允许的连接 | 
|---|---|---|
| 'fred' | 'h1.example.net' | fred,连接 h1.example.net | 
| '' | 'h1.example.net' | 任何用户,从中连接 h1.example.net | 
| 'fred' | '%' | fred,从任何主机连接 | 
| '' | '%' | 任何用户,从任何主机连接 | 
| 'fred' | '%.example.net' | fred,从example.net域中的任何主机连接 | 
| 'fred' | 'x.example.%' | fred,从连接 x.example.net,x.example.com, x.example.edu,等; 这可能没用 | 
| 'fred' | '198.51.100.177' | fred,从主机与IP地址连接 198.51.100.177 | 
| 'fred' | '198.51.100.%' | fred,从198.51.100C类子网中的任何主机连接 | 
| 'fred' | '198.51.100.0/255.255.255.0' | 与前面的示例相同 | 
2.2.3 修改用户权限
执行Grant,revoke,set password,rename user命令修改权限之后, MySQL会自动将修改后的权限信息同步加载到系统内存中
如果执行insert/update/delete操作上述的系统权限表之后,则必须再执行刷新权限命令才能同步到系统内存中,刷新权限命令包括:flush privileges/mysqladmin flush-privileges / mysqladmin reload
如果是修改tables和columns级别的权限,则客户端的下次操作新权限就会生效
如果是修改database级别的权限,则新权限在客户端执行use database命令后生效
如果是修改global级别的权限,则需要重新创建连接新权限才能生效
如果是修改global级别的权限,则需要重新创建连接新权限才能生效 (例如修改密码)
2.2.4 创建 mysql 用户
有两种方式创建MySQL授权用户
执行create user/grant命令(推荐方式)# 创建finley 这只是创建用户并没有权限 mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass'; # 把finley 变成管理员用户 mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost' WITH GRANT OPTION; #创建用户并赋予RELOAD,PROCESS权限 ,在所有的库和表上 mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost' identified by '123456'; # 创建keme用户,在test库,temp表, 上的id列只有select 权限 mysql> grant select(id) on test.temp to keme@'localhost' identified by '123456';
2.2.4 回收 mysql 权限
通过revoke命令收回用户权限,回收的时候看一下这个用户有哪些权限然后回收
我对admin 用户做测试
mysql> show grants for admin@'localhost'; mysql> select user,host from mysql.user; mysql> revoke PROCESS ON *.* FROM admin@'localhost';

2.2.5 删除 mysql 用户
通过执行drop user命令删除MySQL用户
还可以通过系统权限表删除(不建议)
mysql> drop user admin@'localhost';
2.2.6 设置MySQL用户资源限制
通过设置全局变量max_user_connections可以限制所有用户在同一时间连接MySQL实例的数量,但此参数无法对每个用户区别对待,所以MySQL提供了对每个用户的资源限制管理
MAX_QUERIES_PER_HOUR:一个用户在一个小时内可以执行查询的次数(基本包含所有语句)
MAX_UPDATES_PER_HOUR:一个用户在一个小时内可以执行修改的次数(仅包含修改数据库或表的语句)
MAX_CONNECTIONS_PER_HOUR:一个用户在一个小时内可以连接MySQL的时间
MAX_USER_CONNECTIONS:一个用户可以在同一时间连接MySQL实例的数量
从5.0.3版本开始,对用户‘user'@‘%.example.com'的资源限制是指所有通过example.com域名主机连接user用户的连接,而不是分别指从host1.example.com和host2.example.com主机过来的连接
2.2.7 修改 mysql 用户密码
修改用户密码的方式包括:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
shell> mysqladmin -u user_name -h host_name password "new_password"
创建用户时指定密码
mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
修改当前会话本身用户密码的方式包括:
mysql> ALTER USER USER() IDENTIFIED BY 'mypass';
mysql> SET PASSWORD = PASSWORD('mypass');
2.2.8 设置MySQL用户密码过期策略
设置系统参数default_password_lifetime作用于所有的用户账户
如果为每个用户设置了密码过期策略,则会覆盖上述系统参数
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER; 密码不过期 ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT; 默认过期策略
手动强制某个用户密码过期
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
2.2.9 mysql 用户 lock
通过执行create user/alter user命令中带account lock/unlock子句设置用户的lock状态
Create user语句默认的用户是unlock状态
# 创建的时候给用户锁定 mysql> create user abc2@localhost identified by 'mysql' account lock;
Alter user语句默认不会修改用户的lock/unlock状态
# 修改用户为unlock mysql> alter user abc2@'localhost' account unlock;
当客户端使用lock状态的用户登录MySQL时,会收到如此报错
Access denied for user ‘user_name'@'host_name'.
Account is locked.
官方文档:https://dev.mysql.com/doc/refman/5.7/en/privilege-system.html
到此这篇关于Mysql 用户权限管理实现的文章就介绍到这了,更多相关Mysql 用户权限管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:MySQL 查询速度慢的原因