MySQL管理之用户权限

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

MySQL用户管理

mysql授权级别

·全局级别

·数据库级别 (能否删除创建库

·表级别

·字段级别

·储存过程、存储函数级别


需要了解的三种权限类型

·管理类

·数据库访问类

·字段类

如果某用户访问数据库服务器的时候频率非常大,每秒N个查询并发,这样会消耗太多服务器资源,也有可能恶意访问数据库服务器,所以为了避免类似情况出现,一般可以在授权的同时限定其操作的次数,这些在执行用户授权时则可以定义的


用户的创建

创建用户命令

mysql> help create user;
Name: 'CREATE USER'
Description:
Syntax:
CREATE USER user_specification                          
使用create user 直接跟用户名以及可选项

   [, user_specification] ...

user_specification:
   user
   [
       IDENTIFIED BY [PASSWORD] 'password'         #
创建用户的同时,直接加identified by 即可创建用户密码

     | IDENTIFIED WITH auth_plugin [AS'auth_string']
   ]

创建用户过程中,IDENTIFIED BY可以省略

授权用户只有select权限,并查看其用户能否创建数据库,一般以这种方式创建完后的用户的权限只有use权限,和简单的show 等权限

比如

mysql> create user test1@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

凡是使用create user方式创建用户则可以默认触发flush privileges


或使用insert into mysql.user

但是不会主动刷新权限,必须手动执行flush privileges;


使用创建好的用户进入数据库

[root@test2 data]# mysql -utest1 -p123456

mysql> show databases;          #show命令不需要单独授权,但是其他数据库都不能看到

+--------------------+
| Database       |
+--------------------+
| information_schema |
| test         |
+--------------------+

2 rows in set (0.00 sec)


用户授权

mysql> help grant;
Name: 'GRANT'
Description:
Syntax:
GRANT
   priv_type [(column_list)]                           #
指明权限类型,比如select insert 等
     [, priv_type [(column_list)]] ...                 #如果有多个权限则使用逗号隔开
   ON [object_type] priv_level                         #权限级别
   TO user_specification [, user_specification] ...    
   [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] #需求
   [WITH with_option ...]

GRANT PROXY ON user_specification
   TO user_specification [, user_specification] ...
   [WITH GRANT OPTION]


有可能表跟函数重名的,如果重名我们的授权只授权于数据库的表,如果授权的是存储函数,一定加FUNCTION并指定函数名

object_type:

   TABLE
 | FUNCTION
 | PROCEDURE

创建用户并指定函数

grant execute on function db.abc to username@'host';

既有表有bac 也有存储函数名为abc 那么如果想定义函数的话 则需要加function参数:

grant execute on function function db.abc to username@'host';


继续往下看

user_specification:
   user
   [
       IDENTIFIED BY [PASSWORD] 'password'            #
指定用户密码,如果授权密码时,用户不存在,则自动创建用户
     | IDENTIFIED WITH auth_plugin [AS 'auth_string']
   ]


with_option:              

   GRANT OPTION                           #权限可以转授予其他用户,不到万不得已不要使用
 | MAX_QUERIES_PER_HOUR count             #每小时最多允许发出的查询次数,如果不想限定将其值改为0即可
 | MAX_UPDATES_PER_HOUR count             #每个小时最多允许执行的更新的次数
 | MAX_CONNECTIONS_PER_HOUR count         #每小时允许建立几次连接
 | MAX_USER_CONNECTIONS count             #同一个用户账号允许并发连接个数


授权方式

格式

GRANT priv(指定权限),priv2..ON[{TABLE|function|PROCEDURE}] {db.tb| routine} to user@host,可定义多个  with option identfied by 'password'

授权test1对test1数据库有创建的权限

mysql> grant create on test1.* to 'test1'@'%';

Query OK, 0 rows affected (0.00 sec)

切换至test1登录数据库

[root@test2 data]# mysql -utest1 -p123456;

mysql> create database test1;
Query OK, 1 row affected (0.01 sec)

测试创建表

mysql>create table testtb (id intunsigned auto_increment not null,name char(20),primary key(id));
Query OK, 0 rows affected (0.06 sec)

创建没问题,接下来测试插入数据

mysql>insert into testtb(name) values('to');
ERROR 1142 (42000): INSERT command denied to user 'test1'@'localhost' for table'testtb'

可显是不行的 因为只给了创建的权限但并没有赋予写入表的权限


于是再次授权于其用户insert权限

mysql>grant insert on test1.* to 'test1'@'%';
Query OK, 0 rows affected (0.00 sec)

#这里直接写insert表示直接插入表即可

但是插入数据缺报错了

mysql>insert into testtb(name) values('to');
ERROR 1142 (42000): INSERT command denied to user 'test1'@'localhost' for table'testtb'

重启会话再次执行

插入成功,说明必要时必须要重新建立会话才可以

[root@test2data]# mysql -utest1 -p123456;

mysql>insert into testtb(name) values('to');
Query OK, 1 row affected (0.01 sec)

查看用户权限表

格式: SHOW GRANTS FORUSER;

mysql> SHOW GRANTS FOR 'test1'@'%' ;
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@%                                                                                    |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'  |
| GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
| GRANT CREATE ON `abc`.* TO'test1'@'%'                                                                |
| GRANT INSERT, CREATE ON `test1`.* TO'test1'@'%'                                                      |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                         |    
+------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)


赋予其select权限

mysql>grant select on test1.* to 'test1'@'%';
Query OK, 0 rows affected (0.00 sec)    


mysql> show grants for 'test1'@'%';
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@%                                                                                    |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'  |
| GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
| GRANT CREATE ON `abc`.* TO'test1'@'%'                                                                |
| GRANT SELECT, INSERT, CREATE ON `test1`.* TO'test1'@'%'                                              |
| GRANT CREATE ON `mysql`.`wpdb` TO 'test1'@'%'                                                        |
+------------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)


授权具有执行alter权限

我们要在testtb表中加入一个字段,如下所示

mysql>use test1;
Database changed
mysql> select * from testtb;
+----+------+
| id | name |
+----+------+
|  1 | to   |
+----+------+
1 row in set (0.00 sec)

授权其alter权限

mysql>grant alter on test1.* to 'test1'@'%';

重启会话

mysql>alter table testtb add age tinyint unsigned;
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0

如下所示可以看到我们新加的字段了

mysql>select * from testtb;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | to  | NULL  |
+----+------+------+
1 row in set (0.00 sec)


只授权某表中的某个字段的权限

mysql>grant update(age) on test1.testtb to 'test1'@'%';
Query OK, 0 rows affected (0.01 sec)


更新age某字段

mysql>update testtb set age=30 where id=1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from testtb;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | to |  30    |
+----+------+------+
1 row in set (0.00 sec)


更改name字段出现了错误

mysql>update testtb set name=ot where id=1;
ERROR 1143 (42000): UPDATE command denied to user 'test1'@'localhost' forcolumn 'name' in table 'testtb'


再次showgrants for 查看其用户权限

在字段上是单独写的,其他权限全部合并起来了

#只要在表级别存储过程级别或存储函数、库级别 全都合并在了一起

在字段或列级别而都以字段级别和列级别合并在一起

mysql>show grants for test1@'%';
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@%                                                                                    |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'  |
| GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
| GRANT CREATE ON `abc`.* TO'test1'@'%'                                                                |
| GRANT SELECT, INSERT, CREATE, ALTER ON `test1`.* TO'test1'@'%'                                       |
| GRANT UPDATE (age) ON `test1`.`testtb` TO'test1'@'%'                                                 |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                         |  
+------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)



删除用户

格式 :

mysql>drop user@host;


用户重命名

renameuser

mysql>help rename user;
Name: 'RENAME USER'
Description:
Syntax:
RENAME USER old_user TO new_user
   [, old_user TO new_user] ...

RENAMEUSER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';


取消授权

revokefrom


mysql>help revoke;
Name: 'REVOKE'
Description:
Syntax:
REVOKE
   priv_type [(column_list)]              #
想收回那个权限
     [, priv_type [(column_list)]] ...    #如果是字段上的权限也可以明确指定并收回


   ON [object_type] priv_level
   FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION
   FROM user [, user] ...

REVOKE PROXY ON user
   FROM user [, user] ...

取消其用户的select权限

mysql>show grants for test1@'%';
+------------------------------------------------------------------------------------------------------+
| Grants fortest1@%                                                                                     |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                              |
| GRANT CREATE ON `abc`.* TO'test1'@'%'                                                               |
| GRANT SELECT, INSERT, CREATE, ALTER ON `test1`.* TO'test1'@'%'                                      |
| GRANT UPDATE (age) ON `test1`.`testtb` TO 'test1'@'%'                                               |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                        |
+------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)


mysql>revoke select on test1.* from test1@'%';
Query OK, 0 rows affected (0.00 sec)

#select已经没有了

mysql> showgrants for test1@'%';
+------------------------------------------------------------------------------------------------------+
| Grants for test1@%                                                                                  |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
| GRANT CREATE ON `abc`.* TO 'test1'@'%'                                                               |
| GRANT INSERT, CREATE, ALTER ON `test1`.* TO 'test1'@'%'                                              |
| GRANT UPDATE (age) ON `test1`.`testtb` TO'test1'@'%'                                                 |
| GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                         |
+------------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)

一般来讲select都是读权限,一般可以赋予,其他权限则都为写权限需要慎重考虑授权



本文转自zuzhou 51CTO博客,原文链接:http://blog.51cto.com/yijiu/1393230

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
安全 关系型数据库 MySQL
《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)
《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)
81 3
|
5月前
|
运维 监控 安全
云HIS医疗管理系统源码——技术栈【SpringBoot+Angular+MySQL+MyBatis】
云HIS系统采用主流成熟技术,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分,功能易扩展;支持多样化灵活配置,提取大量公共参数,无需修改代码即可满足不同客户需求;服务组织合理,功能高内聚,服务间通信简练。
164 4
|
2月前
|
关系型数据库 MySQL 数据库
MySQL用户权限管理你知道多少?
MySQL用户权限管理你知道多少?
78 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
44 1
|
4月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(4)-DCL(管理用户、权限控制)
MySQL数据库——SQL(4)-DCL(管理用户、权限控制)
38 1
|
5月前
|
存储 数据可视化 关系型数据库
【MySQL进阶之路 | 基础篇】创建和管理数据库
【MySQL进阶之路 | 基础篇】创建和管理数据库
|
4月前
|
SQL 关系型数据库 MySQL
MySQL管理与连接
MySQL管理与连接
|
4月前
|
关系型数据库 MySQL 数据库
5.Mysql 用户权限管理
5.Mysql 用户权限管理
29 0
|
5月前
|
安全 关系型数据库 MySQL
|
5月前
|
Java 数据挖掘 BI
Java医院绩效考核系统源码B/S+avue+MySQL助力医院实现精细化管理
医院绩效考核系统目标是实现对科室、病区财务指标、客户指标、流程指标、成长指标的全面考核、分析,并与奖金分配、学科建设水平评价挂钩。
67 0