在数据库服务中,权限管理可以用于针对不同的用户,限制登录管理数据库服务用户的操作行为,也可以区分不同用户的操作能力;

思考:系统权限和数据库权限作用在哪?

系统权限是作用于文件上的;

数据库权限是作用在用户上的,或者角色(相当于系统的用户组)上的;

数据库服务常见的权限管理定义设置:(采用具有的字符参数信息进行定义,并且权限是赋予数据库管理用户的

数据库服务中可以授权的所有权限信息查看:

MySQL> show privileges;

输出展示的信息表示内容:

序号 输出列 解释说明
01 Privilege 表示可以授权的所有权限信息展示
02 Context 表示设置的权限可以对数据库服务哪些资源进行操作
03 Comment 对相应的权限功能进行简单解释说明

核心重要授权权限总结:

序号 权限 授权资源 解释说明
01 Select Tables 可以对表进行操作,查询表中数据信息
02 Insert Tables 可以对表进行操作,插入表中数据信息
03 Update Tables 可以对表进行操作,修改表中数据信息
04 Delete Tables 可以对表进行操作,删除表中数据信息
05 Alter Tables 可以对表进行操作,修改表中结构信息(元数据-属性)
06 Index Tables 可以对表进行操作,删除或创建表中的索引信息
07 Create Databases,Tables 可以对表和库进行操作,用于创建数据库和表信息
08 Drop Databases,Tables 可以对表和库进行操作,用于删除数据库和表信息

说明:all privileges(all)包含查看的所有权限信息,但是唯独缺了Grant option,不能授权用户,此权限只能给root@local用户

数据库服务中用户授权信息的存放位置:授权表 oldboy@% -- select update

```tiki wiki

切换进入到默认mysql数据库中

mysql> use mysql;

查看数据库中的信息

mysql> show tables; -- 查看mysql数据库中的表信息

常见的授权表信息说明:

| 序号 | 授权表名称  | 解释说明                                                     |
| ---- | ----------- | ------------------------------------------------------------ |
| 01   | user        | 主要用于存储用户、主机域、密码、加密插件等信息,同时还存储了\*.\*级别的权限(全局权限) |
| 02   | db          | 主要用于存储用户、主机域等信息,同时还存储了单库级别的权限(局部权限) |
| 03   | tables_priv | 主要用于存储用户、主机域等信息,同时还存储了单表级别的权限(局部权限) |

> 说明:以上授权表信息了解作用即可,不建议采用手工方式对授权表中的数据进行修改调整

# 一、设置数据库服务用户授权

通过理解数据库内部结构,可以知晓,数据库是一个很大的仓库,里面包含多个库,每个库中有多个表,每个表中有多个行和列;

当然作为数据库服务管理用户,要管理的不仅仅是库和表,其实还有视图、触发器、存储过程等和数据库有关的信息;

因此,在某些时候创建完用户信息,还需要对创建的用户进行授权,就是让不同用户拥有管理库和表对象的权限。

## 1.1 授权语法格式

授权语法格式

```sql
# 授权语法格式
MySQL> grant  all    on     授权对象范围   to        权限赋予用户信息
MySQL> grant  all    on    *       .      *       to     blog@'192.168.30.%';
               授权   权限         库信息     表信息           用户       主机域

1、对所有的数据库和所有的表进行授权

mysql> grant  all  on   *.*

2、对指定的数据库中所有的表进行授权

mysql> grant  all  on   oldboy.*

3、对指定的数据库中指定的表进行授权

mysql> grant  all  on   oldboy.t1

1.2 具体授权权限操作步骤

1、创建测试用户user05

mysql> create user user05@'192.168.1.%' identified by '123456';

2、赋权给用户

mysql> grant  Insert,Delete,Update,Select  on   * . *   to user05@'192.168.1.%';

3、查看用户权限

mysql> show grants for user05@'192.168.1.%';
+-----------------------------------------------------------------------+
| Grants for user05@192.168.1.%                                         |
+-----------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `user05`@`192.168.1.%` |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

1.3 具体回收权限操作步骤

1、数据库服务用户回收权限

mysql> revoke delete on *.* from user05@'192.168.1.%';

2、查看用户权限,数据库服务用户权限delete回收成功

mysql> show grants for user05@'192.168.1.%';

Day001-数据库服务安装配置过程-图24

二、查看数据库服务用户授权

当用户授权操作完毕后,可以对授权的用户进行查看确认:

mysql> show grants for user05@'192.168.1.%';

企业生产情况授权思路:

企业生产库表授权一定要更小,最小的授权最大的安全,给业务用户常规授权,包含对内容的增删改查;

序号 权限 互联网应用
01 SELECT 查询数据 访问网站页面时,表示浏览查看数据信息;
02 INSERT 插入数据 访问网站页面时,表示发表文章数据信息;
03 UPDATE 修改数据 访问网站页面时。表示修改文章数据信息;
04 DELETE 删除数据 访问网站页面时,表示删除文章数据信息;

生产常规授权实践:

1、进入数据库并创建数据库bbs

[root@master ~]# mysql -uroot -p123456
mysql> create database bbs;

2、创建管理数据库用户

mysql> create user bbs@'192.168.1.%' identified by '123456';

3、进行管理用户授权

mysql> grant insert,select,update,delete on bbs.* to bbs@'192.168.1.%';

授权等价于root管理用户

mysql> grant all on *.* to bbs@'192.168.1.%' identified by '123456' with grant option;
mysql> flush privileges;

相关参数说明:

  • with grant option:允许 'bbs' 用户将这些权限授予其他用户

特殊数据库权限说明:

特殊权限 特殊权限说明
Usage 只有连接数据库的权限
all 将管理员身份的所有权限可以赋予其他用户,唯独没有grant option权限
grant option 给其他用户赋予权限能力

特殊数据库权限授权方法:

进行用户权限授权(grant option)情况一:

# 授权命令语法格式
create user 'user'@'ip' identified by 'password';
grant SELECT on op_db.* to 'user'@'ip' with grant option;

# 授权命令实际应用
create user 'root'@'127.0.0.1' identified by '****';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
flush privileges;

进行用户权限授权(grant option)情况二:

grant SELECT on op_db.* to 'user'@'ip' identified by 'password' with grant option;
flush privileges;

说明:WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。

经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项,导致后来该用户不能使用GRANT命令创建用户;

或者给其它用户授权。如果不想这个用户有这个grant的权限,可以不加这句;

三、数据库服务权限管理特性(5.7与8.0权限管理区别)

之前的版本,在设置权限信息时,是能针对用户设置权限

之后版本,出现了数据库服务中对用户的role支持,表示可以将企业中常用的权限汇总打包为一个特定的role信息,在赋予给指定用户;

指定用户操作特定数据库时,具有共性相同的权限:分为运维权限(rw) 分为开发权限(ro)

具体操作演示过程:

1、查看role创建的方法

mysql> help create role;

2、创建指定的role信息

(1) 创建多个角色

mysql> CREATE ROLE 'admin', 'developer';

(2) 创建了一个名为 'webapp' 的角色,并将其限制在 'localhost' 上,不加@信息表示角色白名单为%方式,实际还要根据具体用户定义

mysql> CREATE ROLE 'webapp'@'localhost';

3、创建管理数据库信息并创建表插入数据

mysql> create database db01;
mysql> use db01;
mysql> create table stu(id int);
mysql> insert into stu values(1);
mysql> insert into stu values(2);
mysql> insert into stu values(3);

结果验证

mysql> select * from db01.stu;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

4、创建两个不同的role组信息

mysql> create role db01_rw, db01_r;

相关参数说明:

  • db01_rw: db01.* rw(select,update,insert,delete)
  • db01_r: db01.* r(select)

5、进行role权限信息设定

mysql> grant select on db01.* to db01_r;
mysql> grant select,update,insert,delete on db01.* to db01_rw;

6、将指定role信息与相应的用户信息进行捆绑

(1) 创建需要捆绑role权限的用户信息

mysql> create user user01@'%' identified by '123';
mysql> create user user02@'%' identified by '123';

(2) 实现不同的role信息与不同的用户进行捆绑

mysql> grant db01_r to user01@'%';
mysql> grant db01_rw to user02@'%';

6、进行角色信息激活

(1) 方式一:手动激活角色

利用数据库管理员账号手工激活角色

mysql> set default role all to user01@'%';
mysql> set default role all to user02@'%';

user01登录数据库,会显示对应激活的角色信息

[root@master ~]# mysql -uuser01 -p123 -h192.168.1.25
mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| `db01_r`@`%`   |
+----------------+
1 row in set (0.00 sec)

user02登录数据库,会显示对应激活的角色信息

[root@master ~]# mysql -uuser02 -p123 -h192.168.1.25
mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| `db01_rw`@`%`  |
+----------------+
1 row in set (0.00 sec)

(2) 方式二:实现自动激活用户角色信息

设置自动激活用户角色信息

mysql > set global activate_all_roles_on_login=on;

检查是否设置,0代表没有设置,1代表设置

mysql> select @@activate_all_roles_on_login;
+-------------------------------+
| @@activate_all_roles_on_login |
+-------------------------------+
|                             0 |
+-------------------------------+
1 row in set (0.00 sec)

user01登录数据库,会显示对应激活的角色信息

[root@master ~]# mysql -uuser01 -p123 -h192.168.1.25
mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| `db01_r`@`%`   |
+----------------+
1 row in set (0.00 sec)

user02登录数据库,会显示对应激活的角色信息

[root@master ~]# mysql -uuser02 -p123 -h192.168.1.25
mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| `db01_rw`@`%`  |
+----------------+
1 row in set (0.00 sec)

7、进行用户操作验证

user01只读用户登录数据库,只能查看操作,不能进行其他操作

mysql> select * from db01.stu;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

mysql> delete from stu where id=1;
ERROR 1142 (42000): DELETE command denied to user 'user01'@'master' for table 'stu'

user02 user02读写用户登录数据库,可以进行其他操作任务

mysql> delete from db01.stu where id=1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from db01.stu;
+------+
| id   |
+------+
|    2 |
|    3 |
+------+
2 rows in set (0.00 sec)