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 |
- Routine_type是枚举类型,代表是存储过程还是函数
- 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 |
权限认证中的大小写敏感问题
- 字段user,password,authencation_string,db,table_name大小写敏感
- 字段host,column_name,routine_name大小写不敏感
2.2 用户权限信息管理
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的授权用户由两部分组成:用户名和登录主机名
- 表达用户的语法为'user_name'@'host_name'
- 单引号不是必须,但如果其中
包含特殊字符则是必须的
- ”@‘localhost'代表匿名登录的用户
- Host_name可以使主机名或者ipv4/ipv6的地址。 Localhost代表本机, 127.0.0.1代表ipv4本机地址, ::1代表ipv6的本机地址
- Host_name字段允许使用
%和_
两个匹配字符,比如'%'代表所有主机, '%.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命令
(推荐方式)- 通过insert语句直接操作MySQL系统权限表
# 创建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作用于所有的用户账户
- default_password_lifetime=180 设置180天过期
- default_password_lifetime=0 设置密码不过期
如果为每个用户设置了密码过期策略,则会覆盖上述系统参数
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内容来自木庄网络博客
标签:Mysql
相关阅读 >>
在 mysql 中 int (10) 和 int (11) 的区别
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。