Mysql 用户权限管理实现


当前第2页 返回上一页

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
HostProxied_host 60
UserProxied_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如何查询前20条记录

mysql如何求时间段平均值

闲谈 mysql内存管理,内存分配器和操作系统

mysql并列排名和顺序排名查询

mysql中limit的一些高级用法

python如何操作mysql

mysql大小写问题及解决方案

mysql基础入门之case语句用法实例

centos7 mysql 5.6 多主一从 解决方案与详细配置

mysql数据库怎么给表增加一个字段?

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

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



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...