MySQL用户与权限管理 1.DCL介绍
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限
2.DCL的作用 3.用户管理 相关命令
注意 4.权限管理 MySQL中的常见权限
相关命令
注意 5.角色管理 角色的理解
引入角色的目的是 方便管理拥有相同权限的用户 。恰当的权限设定,可以确保数据的安全性,这是至关重要的
创建角色 语法
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...
注意
角色名称的命名规则和用户名类似。如果 host_name省略,默认为% , role_name不可省略 ,不可为空
练习
CREATE ROLE 'manager'@'localhost';
给角色赋予权限 说明
创建角色之后,默认这个角色是没有任何权限的,我们需要给角色授权。
语法
GRANT privileges ON table_name TO 'role_name'[@'host_name'];
语法说明
上述语句中privileges代表权限的名称,多个权限以逗号隔开。可使用SHOW语句查询权限名称
查询权限名称语句
SHOW PRIVILEGES\G;
练习
现在想给经理角色授予商品信息表、盘点表和应付账款表的只读权限,就可以用下面的代码来实现:
GRANT SELECT ON demo.settlement TO 'manager';
GRANT SELECT ON demo.goodsmaster TO 'manager';
GRANT SELECT ON demo.invcount TO 'manager';
查看角色的权限 说明
赋予角色权限之后,我们可以通过 SHOW GRANTS 语句,来查看权限是否创建成功了
命令
SHOW GRANTS FOR 'manager';
回收角色的权限 说明
角色授权后,可以对角色的权限进行维护,对权限进行添加或撤销。添加权限使用GRANT语句,与角色 授权相同。撤销角色或角色权限使用REVOKE语句。
修改了角色的权限,会影响拥有该角色的账户的权限。
命令
REVOKE privileges ON tablename FROM 'rolename';
练习
# 撤销school_write角色的权限
# 撤销权限命令
REVOKE INSERT, UPDATE, DELETE ON school.* FROM 'school_write';
# 查看school_write角色的权限
SHOW GRANTS FOR 'school_write';
删除角色 说明
当我们需要对业务重新整合的时候,可能就需要对之前创建的角色进行清理,删除一些不会再使用的角 色。删除角色的操作很简单,你只要掌握语法结构就行了。
命令
DROP ROLE role [,role2]...
给用户赋予角色 说明
角色创建并授权后,要赋给用户并处于 激活状态 才能发挥作用。给用户添加角色可使用GRANT语句
命令
GRANT role [,role2,...] TO user [,user2,...];
命令说明
在上述语句中,role代表角色,user代表用户。可将多个角色同时赋予多个用户,用逗号隔开即可。
练习
# 给kangshifu用户添加角色school_read权限
# 使用GRANT语句给kangshifu添加school_read权限,SQL语句如下。
GRANT 'school_read' TO 'kangshifu'@'localhost';
# 添加完成后使用SHOW语句查看是否添加成功,SQL语句如下。
SHOW GRANTS FOR 'kangshifu'@'localhost';
# 使用kangshifu用户登录,然后查询当前角色,如果角色未激活,结果将显示NONE。SQL语句如下
SELECT CURRENT_ROLE();
激活角色 方式一
# 语法
SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';
# 例子:使用 SET DEFAULT ROLE 为下面4个用户默认激活所有已拥有的角色如下
SET DEFAULT ROLE ALL TO
'dev1'@'localhost',
'read_user1'@'localhost',
'read_user2'@'localhost',
'rw_user1'@'localhost';
方式二
# 查看默认值
show variables like 'activate_all_roles_on_login';
# 设置激活,这条 SQL 语句的意思是,对 所有角色永久激活。运行这条语句之后,用户才真正拥有了赋予角色的所有权限
SET GLOBAL activate_all_roles_on_login=ON;
撤销用户的角色 命令
REVOKE role FROM user;
练习
# 撤销kangshifu用户的school_read角色。
# 撤销的SQL语句如下
REVOKE 'school_read' FROM 'kangshifu'@'localhost';
# 撤销后,执行如下查询语句,查看kangshifu用户的角色信息
SHOW GRANTS FOR 'kangshifu'@'localhost';
设置强制角色 方式一:服务启动前设置
[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'; #系统重启后失效
6.密码管理 密码的基本命令
# 修改当前用户密码
# 修改当前用户的密码:(MySQL5.7测试有效)
SET PASSWORD = PASSWORD('123456');
# 使用ALTER USER命令来修改当前用户密码
ALTER USER USER() IDENTIFIED BY '新的密码';
# 修改当前用户密码
# 该语句会自动将密码加密后再赋给当前用户
SET PASSWORD='新的密码';
# 修改其它用户密码
# 使用ALTER语句来修改普通用户的密码
ALTER USER user [IDENTIFIED BY '新密码'] [,user[IDENTIFIED BY '新密码']]…;
# 使用SET命令来修改普通用户的密码
SET PASSWORD FOR 'username'@'hostname'='new_password';
# 不推荐使用
UPDATE MySQL.user SET authentication_string=PASSWORD("123456") WHERE User = "username" AND Host = "hostname";
密码过期策略 介绍 基本命令
# 基本命令
ALTER USER user PASSWORD EXPIRE;
# 建立全局策略,设置密码每隔180天过期
SET PERSIST default_password_lifetime = 180;
# 配置文件my.cnf中进行维护,建立全局策略,设置密码每隔180天过期
[mysqld]
default_password_lifetime=180
# 单独设置账号过期时间
# 设置kangshifu账号密码每90天过期:
CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
# 设置密码永不过期:
CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER;
# 延用全局密码过期策略:
CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT;
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT;
密码重用策略
# 全局
# 方式一
SET PERSIST password_history = 6; #设置不能选择最近使用过的6个密码
SET PERSIST password_reuse_interval = 365; #设置不能选择最近一年内的密码
# 方式二配置文件
[mysqld]
password_history=6
password_reuse_interval=365
# 单独设置某个用户
#不能使用最近5个密码:
CREATE USER 'kangshifu'@'localhost' PASSWORD HISTORY 5;
ALTER USER 'kangshifu'@'localhost' PASSWORD HISTORY 5;
#不能使用最近365天内的密码:
CREATE USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
#既不能使用最近5个密码,也不能使用365天内的密码
CREATE USER 'kangshifu'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'kangshifu'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
7.访问控制管理 连接核实阶段
当用户试图连接MySQL服务器时,服务器基于用户的身份以及用户是否能提供正确的密码验证身份来确 定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码,MySQL服务器 接收到用户请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信 息
服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受 连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待 用户请求
请求核实阶段
一旦建立了连接,服务器就进入了访问控制的阶段2,也就是请求核实阶段。对此连接上进来的每个请 求,服务器检查该请求要执行什么操作、是否有足够的权限来执行它,这正是需要授权表中的权限列发 挥作用的地方。这些权限可以来自user、db、table_priv和column_priv表
确认权限时,MySQL首先 检查user表 ,如果指定的权限没有在user表中被授予,那么MySQL就会继续 检 查db表 ,db表是下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指 定数据库的所有表中的数据;如果在该层级没有找到限定的权限,则MySQL继续 检查tables_priv表 以 及 columns_priv表 ,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将 返回错 误信息 ,用户请求的操作不能执行,操作失败
注意
MySQL通过向下层级的顺序(从user表到columns_priv表)检查权限表,但并不是所有的权 限都要执行该过程。例如,一个用户登录到MySQL服务器之后只执行对MySQL的管理操作,此时只 涉及管理权限,因此MySQL只检查user表。另外,如果请求的权限操作不被允许,MySQL也不会继 续检查下一层级的表
8.权限表 user表 介绍
user表是MySQL中最重要的一个权限表, 记录用户账号和权限信息 ,有49个字段
这些字段可以分成4类,分别是范围列(或用户列)、权限列、安全列和资源控制列
范维列/用户列 host:表示连接类型 user:表示用户名,同一用户通过不同方式链接的权限是不一样的password:密码 权限列 Grant_priv:表示是否拥有GRANT权限Shutdown_priv:表示是否拥有停止MySQL服务的权限Super_priv:表示是否拥有超级权限Execute_priv:表示是否拥有EXECUTE权限。拥有EXECUTE权限,可以执行存储过程和函数Select_priv , Insert_priv等:为该用户所拥有的权限 安全列
安全列只有6个字段,其中两个是ssl相关的(ssl_type、ssl_cipher),用于 加密 ;两个是x509
相关的(x509_issuer、x509_subject),用于 标识用户 ;另外两个Plugin字段用于 验证用户身份 的插件,该字段不能为空。如果该字段为空,服务器就使用内建授权验证机制验证用户身份
资源控制列
资源控制列的字段用来 限制用户使用的资源 ,包含4个字段
max_questions:用户每小时允许执行的查询操作次数max_updates:用户每小时允许执行的更新操作次数max_connections:用户每小时允许执行的连接操作次数max_user_connections:用户允许同时建立的连接次数 db表 用户列:db表用户列有3个字段,分别是Host、User、Db。这3个字段分别表示主机名、用户名和数据库名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。权限列:Create_routine_priv和Alter_routine_priv这两个字段决定用户是否具有创建和修改存储过程的权限 tables_priv与columns_priv表 介绍
tables_priv表用来 对表设置操作权限 ,columns_priv表用来对表的 某一列设置权限
tables_priv表有8个字段 Host:主机名Db:数据库名User:用户名Table_name:表名Grantor:修改该记录的用户Timestamp:修改该记录的时间Table_priv:示对象的操作权限。包括Select、Insert、Update、Delete、Create、Drop、Grant、 References、Index和AlterColumn_priv:表中的列的操作权限,包括Select、Insert、Update和References procs_priv表
procs_priv表可以对存储过程和存储函数设置操作权限