MySQL只允许你做你权力以内的事情,不可以越界。比如:
只允许你执行SELECT操作,就不能执行UPDATE操作。只允许你从某台机器上连接MySQL,就不也能从其它机器上连接MySQL
权限是指该用户针对某些数据库、库内的表甚至到列是否具有操作的权力。
show privileges;
| 权限分布 | 可能设置的权限 | |
|---|---|---|
| 1 | 表权限 | select,insert,update,delete,create,drop,grant,references,index,alter |
| 2 | 列权限 | select,insert,update,references |
| 3 | 过程权限 | execute,alter routine,grant |
可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将 MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的数据库。
允许在一个数据库现有的表上实施操作。
只有在它们真正从一个表中检索行时才被用到。
允许创建或删除索引,INDEX适用于已 有的表。如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义。
可以使用ALTER TABLE来更改表的结构和重新命名表。
用来创建保存的 程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序,
用来执行保存的 程序。
允许授权给其他用户,可用于数据库、表和保存的程序。
使用户可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权 限的用户都能读或写MySQL服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。
GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123';
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
举例
GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost ;
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
需要用户重新登录后才能生效
#收回全库全表的所有权限
REVOKE ALL PRIVILEGES ON *.* FROM joe@'%';
#收回mysql库下的所有表的插删改查权限
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM joe@localhost;
当用户试图连接MySQL服务器时,服务器基于用户的身份以及用户是否能提供正确的密码验证身份来确 定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码,MySQL服务器 接收到用户请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信 息。 服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受 连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待 用户请求。
一旦建立了连接,服务器就进入了访问控制的阶段2,也就是请求核实阶段。对此连接上进来的每个请 求,服务器检查该请求要执行什么操作、是否有足够的权限来执行它,这正是需要授权表中的权限列发 挥作用的地方。这些权限可以来自user、db、table_priv和column_priv表。
① 首先 检查user表 ,如果指定的权限没有在user表中被授予,那么MySQL就会继续 检 查db表 ,
② db表是下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指 定数据库的所有表中的数据;如果在该层级没有找到限定的权限,
③ 继续 检查tables_priv表 以 及 columns_priv表 ,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将 返回错 误信息 ,用户请求的操作不能执行,操作失败。
在MySQL中,角色是权限的集合,可以为角色添加或移除权限。(MySQL8.0引入的新功能)
方便管理拥有相同权限的用户。用户可以被赋予角色,同时也被授予角色包含的权限。
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...
GRANT privileges ON table_name TO 'role_name'[@'host_name'];
举例
GRANT SELECT ON demo.settlement TO 'manager';
SHOW GRANTS FOR 'manager';
REVOKE privileges ON tablename FROM 'rolename';
DROP ROLE role [,role2]...
注:如果删除了角色,那么用户也就失去了通过这个角色所获得的所有权限
GRANT role [,role2,...] TO user [,user2,...];
查看当前用户的角色是否被激活
SELECT CURRENT_ROLE();
SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';
REVOKE role FROM user;
[mysqld]
mandatory_roles='role1,role2@localhost,r3@%.atguigu.com'
# 系统重启后仍然有效
SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com';
# 系统重启后失效
SET GLOBAL mandatory_roles = 'role1,role2@localhost,r3@%.example.com';