目录
笔记参考:MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!_哔哩哔哩_bilibili
1. 用户管理
MysQL用户可以分为普通用户和root用户。root用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户的密码等管理权限;普通用户只拥有被授予的各种权限。
MySQL提供了许多语句用来管理用户账号,这些语句可以用来管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。
MySQL数据库的安全性需要通过账户管理来保证。
1.1 登录MySQL服务器
启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下:
mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"
下面详细介绍命令中的参数:
-
-h参数 后面接主机名或者主机IP,hostname为主机,hostIP为主机IP。
-
-P参数 后面接MySQL服务的端口,通过该参数连接到指定的端口。MySQL服务的默认端口是3306, 不使用该参数时自动连接到3306端口,port为连接的端口号。
-
-u参数 后面接用户名,username为用户名。
-
-p参数 会提示输入密码。
-
DatabaseName参数 指明登录到哪一个数据库中。如果没有该参数,就会直接登录到MySQL数据库 中,然后可以使用USE命令来选择数据库。
-
-e参数 后面可以直接加SQL语句。登录MySQL服务器以后即可执行这个SQL语句,然后退出MySQL 服务器。
举例:
mysql -uroot -p -hlocalhost -P3306 mysql -e "select host,user from user"
1.2 创建用户
CREATE USER语句的基本语法形式如下:
CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];
-
用户名参数表示新建用户的账户,由 用户(User) 和 主机名(Host) 构成;
-
“[ ]”表示可选,也就是说,可以指定用户登录时需要密码验证,也可以不指定密码验证,这样用户可以直接登录。不过,不指定密码的方式不安全,不推荐使用。如果指定密码值,这里需要使用 IDENTIFIED BY指定明文密码值。
-
CREATE USER语句可以同时创建多个用户。
举例:
CREATE USER zhang3 IDENTIFIED BY '123123'; # 默认host是 % # 指明host CREATE USER 'kangshifu'@'localhost' IDENTIFIED BY '123456';
1.3 修改用户(很少使用)
修改用户名:
UPDATE mysql.user SET USER='li4' WHERE USER='wang5'; FLUSH PRIVILEGES;
1.4 删除用户
在MysQL数据库中,可以使用DROP USER语句来删除普通用户,也可以直接在mysql.user表中删除用户。
方式1:使用DROP方式删除(推荐)
使用DROP USER语句来删除用户时,必须用于DROP USER权限。DROP USER语句的基本语法形式如下:
DROP USER user[,user]…;
举例:
DROP USER li4 ; # 默认删除host为%的用户 DROP USER 'kangshifu'@'localhost';
方式2:使用DELETE方式删除
DELETE FROM mysql.user WHERE Host=’hostname’ AND User=’username’;
Host字段和User字段是user表的联合主键,因此两个字段的值才能唯一确定一条记录。
执行完DELETE命令后要使用FLUSH命令来使用户生效,命令如下:
FLUSH PRIVILEGES;
举例:
DELETE FROM mysql.user WHERE Host='localhost' AND User='Emily'; FLUSH PRIVILEGES;
注意:不推荐通过 DELETE FROM USER u WHERE USER='li4' 进行删除,系统会有残留信息保留。而drop user命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db表 的相应记录都消失了。
1.5 设置当前用户密码
适用于root用户修改自己的密码,以及普通用户登录后修改自己的密码。
root用户拥有很高的权限,因此必须保证root用户的密码安全。root用户可以通过多种方式来修改密码,使用ALTER USER修改用户密码是MySQL官方推荐的方式。此外,也可以通过SET语句修改密码。由于MysQL 8中已移除了PASSWORD()函数,因此不再使用UPDATE语句直接操作用户表修改密码。
旧的写法如下 :
# 修改当前用户的密码:(MySQL5.7测试有效) SET PASSWORD = PASSWORD('123456');
这里介绍推荐的写法 :
-
使用ALTER USER命令来修改当前用户密码 用户可以使用ALTER命令来修改自身密码,如下语句代表修 改当前登录用户的密码。基本语法如下:
ALTER USER USER() IDENTIFIED BY 'new_password';
-
使用SET语句来修改当前用户密码 使用root用户登录MySQL后,可以使用SET语句来修改密码,具体 SQL语句如下:
SET PASSWORD='new_password';
该语句会自动将密码加密后再赋给当前用户。
1.6 修改其它用户密码
root用户不仅可以修改自己的密码,还可以修改其它普通用户的密码。root用户登录MysQL服务器后,可以通过ALTER语句和SET语句来修改普通用户的密码。由于PASSWORD()函数已移除,因此使用UPDATE直接操作用户表的方式已不再使用。
-
使用ALTER语句来修改普通用户的密码 可以使用ALTER USER语句来修改普通用户的密码。基本语法形 式如下:
ALTER USER user [IDENTIFIED BY '新密码'][,user[IDENTIFIED BY '新密码']]…;
练习:下面使用ALTER语句来修改kangshifu用户的密码,将密码改为“HelloWorld"。
ALTER USER 'kangshifu'@'localhost' IDENTIFIED BY 'HelloWorld';
-
使用SET命令来修改普通用户的密码 使用root用户登录到MySQL服务器后,可以使用SET语句来修改普 通用户的密码。SET语句的代码如下:
SET PASSWORD FOR 'username'@'hostname'='new_password';
练习:下面使用ALTER语句来修改kangshifu用户的密码,将密码改为“HelloWorld"。
SET PASSWORD for 'kangshifu'@'localhost'= 'HelloWorld';
-
使用UPDATE语句修改普通用户的密码(不推荐)
1.7 MySQL8密码管理(了解)
MySQL中记录使用过的历史密码,目前包含如下密码管理功能:
(1)密码过期:要求定期修改密码。 (2)密码重用限制:不允许使用旧密码。 (3)密码强度评估:要求使用高强度的密码。(第1章已讲)
2. 权限管理
关于MysQL的权限简单的理解就是MySQL允许你做你权力以内的事情,不可以越界。比如只允许你执行SELECT操作,那么你就不能执行UPDATE操作。只允许你从某台机器上连接MySQL,那么你就不能从除那台机器以外的其他机器连接MySQL。
2.1 权限列表
MySQL到底都有哪些权限呢?
show privileges;
MySQL的权限如何分布:
权限分布 | 可能的设置权限 |
---|---|
表权限 | 'Select, 'Insert', 'Update", 'Delete"; 'Create', 'Drop'; 'Grant'; 'References', 'Index'; 'Alter' |
列权限 | 'Select', 'Insert", 'Update', 'References' |
过程权限 | 'Execute', 'Alter Routine', 'Grant' |
2.2 授予权限的原则
权限控制主要是出于安全因素,因此需要遵循以下几个 经验原则 :
1、只授予能 满足需要的最小权限 ,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可 以了,不要给用户赋予update、insert或者delete权限。
2、创建用户的时候 限制用户的登录主机 ,一般是限制成指定IP或者内网IP段。
3、为每个用户 设置满足密码复杂度的密码 。
4、 定期清理不需要的用户 ,回收权限或者删除用户。
2.3 授予权限
给用户授权的方式有 2 种,分别是通过把 角色赋予用户给用户授权 和 直接给用户授权 。用户是数据库的使用者,我们可以通过给用户授予访问数据库中资源的权限,来控制使用者对数据库的访问,消除安全隐患。
授权命令:
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO '用户名'@'用户地址' [IDENTIFIED BY ‘密码口令’];
-
该权限如果发现没有该用户,则会直接新建一个用户。
比如:
给li4用户用本地命令行方式,授予atguigudb这个库下的所有表的插删改查的权限。
GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO 'li4'@'localhost';
授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包 括grant的权限
GRANT ALL PRIVILEGES ON *.* TO 'joe'@'%' IDENTIFIED BY '123';
2.4 查看权限
-
查看当前用户权限
SHOW GRANTS; # 或 SHOW GRANTS FOR CURRENT_USER; # 或 SHOW GRANTS FOR CURRENT_USER()
-
查看某用户的全局权限root用户下
SHOW GRANTS FOR 'user'@'主机地址' ;
2.5 收回权限
收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全性。MysSQL中使用REVOKE语句取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从db、host,tables_priv和columns_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中的账户记录使用DROP USER语句)。
注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。
-
收回权限命令
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM '用户名'@'用户地址';
举例:
#收回全库全表的所有权限 REVOKE ALL PRIVILEGES ON *.* FROM 'joe'@'%'; #收回mysql库下的所有表的插删改查权限 REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM 'joe'@'localhost';
注意: 须用户重新登录后才能生效
有一些程序员喜欢使用Root超级用户来访问数据库,完全把权限控制放在应用层面实现。这样当然也是可以的。但建议大家,尽量使用数据库自己的角色和用户机制来控制访问权限,不要轻易用Root账号。因为Root账号密码放在代码里面不安全,一旦泄露,数据库就会完全失去保护。 而且,MySQL的权限控制功能十分完善,应该尽量利用,可以提高效率,而且安全可靠。
3. 权限表
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中。MySQL数据库系统会根据这些权限表的内容为每个用户赋予相应的权限。这些权限表中最重要的是user表、db表。除此之外,还有table_priv表、column_priv表和proc_priv表等。在MySQL启动时,服务器将这些数据库表中权限信息的内容读入内存。
4. 访问控制(了解)
4.1 连接核实阶段
当用户试图连接MySQL服务器时,服务器基于用户的身份以及用户是否能提供正确的密码验证身份来确 定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码,MySQL服务器 接收到用户请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信息。
服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待用户请求。
4.2 请求核实阶段
5. 角色管理
5.1 角色的理解
角色是在MysQL 8.0中引入的新功能。在MysQL中,角色是权限的集合,可以为角色添加或移除权限。用户可以被赋予角色,同时也被授予角色包含的权限。对角色进行操作需要较高的权限。并且像用户账户一样,角色可以拥有授予和撤消的权限。
引入角色的目的是方便管理拥有相同权限的用户。恰当的权限设定,可以确保数据的安全性,这是至关重要的。
5.2 创建角色
在实际应用中,为了安全性,需要给用户授予权限。当用户数量较多时,为了避免单独给每一个用户授予多个权限,可以先将权限集合放入角色中,再赋予用户相应的角色。
创建角色使用 CREATE ROLE 语句,语法如下:
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...
角色名称的命名规则和用户名类似。如果 host_name省略,默认为% , role_name不可省略 ,不可为空。
练习:我们现在需要创建一个经理的角色,就可以用下面的代码:
CREATE ROLE 'manager'@'localhost';
5.3 给角色赋予权限
创建角色之后,默认这个角色是没有任何权限的,我们需要给角色授权。给角色授权的语法结构是:
GRANT privileges ON table_name TO 'role_name'[@'host_name'];
上述语句中privileges代表权限的名称,多个权限以逗号隔开。可使用SHOW语句查询权限名称。
举例:
GRANT SELECT,INSERT,DELETE,UPDATE ON demo.invcount To 'stocker '; GRANT ALL PRIVILEGES ON app_db.* TO 'app_developer'; #给app_db数据库中所有表的所有权限
5.4 查看角色的权限
赋予角色权限之后,我们可以通过 SHOW GRANTS 语句,来查看权限是否创建成功了:
mysql> SHOW GRANTS FOR 'manager'; +-------------------------------------------------------+ | Grants for manager@% | +-------------------------------------------------------+ | GRANT USAGE ON *.* TO `manager`@`%` | | GRANT SELECT ON `demo`.`goodsmaster` TO `manager`@`%` | | GRANT SELECT ON `demo`.`invcount` TO `manager`@`%` | | GRANT SELECT ON `demo`.`settlement` TO `manager`@`%` | +-------------------------------------------------------+
只要你创建了一个角色,系统就会自动给你一个“ USAGE ”权限,意思是 连接登录数据库的权限 。代码的 最后三行代表了我们给角色“manager”赋予的权限,也就是对商品信息表、盘点表和应付账款表的只读权限。
5.5 回收角色的权限
角色授权后,可以对角色的权限进行维护,对权限进行添加或撤销。添加权限使用GRANT语句,与角色 授权相同。撤销角色或角色权限使用REVOKE语句。
撤销角色权限的SQL语法如下:
REVOKE privileges ON tablename FROM 'rolename';
5.6 删除角色
当我们需要对业务重新整合的时候,可能就需要对之前创建的角色进行清理,删除一些不会再使用的角 色。删除角色的操作很简单,你只要掌握语法结构就行了。
DROP ROLE role [,role2]...
注意, 如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限 。
5.7 给用户赋予角色
角色创建并授权后,要赋给用户并处于 激活状态 才能发挥作用。给用户添加角色可使用GRANT语句,语 法形式如下:
GRANT role [,role2,...] TO user [,user2,...];
在上述语句中,role代表角色,user代表用户。可将多个角色同时赋予多个用户,用逗号隔开即可。
用赋予了角色的用户去登录、操作,你会发现这个账号没有任何权限。这是因为,MySQL中创建了角色之后,默认都是没有被激活,也就是不能用,必须要手动激活,激活以后用户才能拥有角色对应的权限。
5.8 激活角色
方式1:使用set default role 命令激活角色
举例:
SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';
举例:使用 SET DEFAULT ROLE 为下面4个用户默认激活所有已拥有的角色如下:
SET DEFAULT ROLE 'manager'@'localhost' ALL TO 'dev1'@'localhost', 'read_user1'@'localhost', 'read_user2'@'localhost', 'rw_user1'@'localhost';
方式2:将activate_all_roles_on_login设置为ON
SET GLOBAL activate_all_roles_on_login=ON;
这条 SQL 语句的意思是,对所有角色永久激活。运行这条语句之后,用户才真正拥有了赋予角色的所有 权限。
5.9 撤销用户的角色
撤销用户角色的SQL语法如下:
REVOKE role FROM user;
练习:撤销kangshifu用户的school_read角色。 (1)撤销的SQL语句如下
REVOKE 'school_read' FROM 'kangshifu'@'localhost';
5.10 设置强制角色(mandatory role)
强制角色是给每个创建账户的默认角色,不需要手动设置。强制角色无法被REVOKE或者DROP。
方式1:服务启动前设置
[mysqld] mandatory_roles='role1,role2@localhost,r3@%.atguigu.com'
方式2:运行时设置
SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后仍然有效 SET GLOBAL mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后失效
5.11 小结
MySQL主要管理角色的语句如下: