在数据库服务中,权限管理可以用于针对不同的用户,限制登录管理数据库服务用户的操作行为,也可以区分不同用户的操作能力;
思考:系统权限和数据库权限作用在哪?
系统权限是作用于文件上的;
数据库权限是作用在用户上的,或者角色(相当于系统的用户组)上的;
数据库服务常见的权限管理定义设置:(采用具有的字符参数信息进行定义,并且权限是赋予数据库管理用户的)
数据库服务中可以授权的所有权限信息查看:
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.%';

二、查看数据库服务用户授权¶
当用户授权操作完毕后,可以对授权的用户进行查看确认:
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)