Mysql数据库入门基础篇--用户与权限管理

🔻一、Mysql 用户管理

Mysql 用户分为root用户和普通用户,其中root用户是数据库超级管理员,拥有所有权限(创建、删除、修改密码、授权等管理权限),普通用户只拥有被授予的权限。

Mysql数据库的安全性通过账户管理来保障。

1.1 🍃 Mysql服务器登录

🍀 简单使用

[root@db-server ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test01;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from tab1;
+------+--------+-------+
| id   | name   | class |
+------+--------+-------+
| 1001 | 曹操   | 1|
| 1002 | 张飞   | 1|
| 1003 | 项羽   | 3|
| 1004 | 刘备   | 2|
+------+--------+-------+
4 rows in set (0.00 sec)

mysql> 

🍀 复杂使用

#### mysql -h hostname|hostIP -P port -u username -p DatabaseName -e "sql语句";

[root@db-server ~]# mysql -h localhost -P 3306 -p test01 -e "select * from tab1";
Enter password: 
+------+--------+-------+
| id   | name   | class |
+------+--------+-------+
| 1001 | 曹操   | 1|
| 1002 | 张飞   | 1|
| 1003 | 项羽   | 3|
| 1004 | 刘备   | 2|
+------+--------+-------+
[root@db-server ~]# 

1.2 🍃 用户创建

推荐使用create user命令创建用户,Mysql 8.0 版本移除了password加密方法,不再推荐使用insertuser表直接添加用户。

创建用户时,必须拥有 create user 权限,新创建的用户只有登录权限。

#####语法#####
create user '用户名'@'用户地址' identified by '密码';

mysql> create user  liubei identified by 'Liubei@123456';   #默认host是 %
Query OK, 0 rows affected (0.01 sec)

####指定host创建用户####
mysql> create user  'liubei'@'localhost' identified by 'Liubei@123456';
Query OK, 0 rows affected (0.00 sec)
mysql> select host ,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | liubei           |
| %         | root             |
| %         | zyl              |
| localhost | liubei           |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
+-----------+------------------+
7 rows in set (0.00 sec)

mysql> 

用户名以username@hostname格式跟在create user子句之后。表user以host 和user为共同主键,可以创建同名用户(如:liubei)。

####新创建的用户只有登录权限####
mysql> show grants;
+--------------------------------------------+
| Grants for liubei@localhost                |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`localhost` |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> 

1.3 🍃 用户修改

#####语法#####
update 表名 set user='新用户名' where user='旧用户名' and host='用户地址';

mysql> update mysql.user set user='liubei01' where user='liubei' and host='localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;    ###修改之后需要flush privileges 刷新权限。
Query OK, 0 rows affected (0.01 sec)

mysql> 

在这里插入图片描述

1.4 🍃 用户删除

mysql数据库可以使用drop user 语句删除普通用户,也可在mysql.user表中删除用户。

💦 方式一、使用drop删除(推荐)

用户必须具备drop user权限,才能使用drop删除,可以同时删除多个用户,用户之间用逗号隔开:

####语法####
drop user 用户名[,用户名2] [,用户名3]...;
drop user '用户名'@'用户地址'

mysql> drop user liubei;  ###默认删除host 为%用户
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;  ###删除之后需要flush privileges 刷新权限。
Query OK, 0 rows affected (0.00 sec)

mysql> 

💦 方式二、使用delete删除(不推荐)

使用delete删除 ,会有残留信息,而drop user命令会删除用户及其对应权限,mysql.usermysql.db对应记录都会删除。

####语法####
delete from 表名 where user='用户名' and host='用户地址';

mysql> delete from mysql.user where user='liubei01' and host='loaclhost';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;  ###删除之后需要flush privileges 刷新权限。
Query OK, 0 rows affected (0.00 sec)

mysql> 

1.5 🍃 用户密码修改

⛳ 修改当前用户密码

查看当前登录mysql用户:

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

适用于root用户修改自己密码,其他普通用户登录修改自己密码。

root用户具有数据库最高权限,所以必须保证root用户密码安全,推荐使用alter user 修改密码,也可使用set 语句修改,Mysql 8.0 版本移除了PASSWORD加密方法,不再推荐使用update语句直接操作user表修改密码(authentication_string 字段)。

 select host ,user ,authentication_string from user;  

在这里插入图片描述

💦 方式一、使用alter user修改当前用户密码

####语法####
alter user user() identified by '新密码';

mysql> alter user user() identified by 'Zyl@123456'; ###当前root用户登录
Query OK, 0 rows affected (0.01 sec)

mysql> 

💦 方式二、使用set语句修改当前用户密码

####语法####
set password='新密码';

mysql> set password='Zyl@123456';  ###当前root用户登录
Query OK, 0 rows affected (0.01 sec)

mysql> 

⛳修改其他普通用户密码

其他用户密码,可以通过root用户修改,还可自己修改,同样使用alter user 修改密码,或者使用set 语句修改。

💦 方式一、使用alter user修改普通用户密码

####语法####
alter user 用户名@'用户地址' identified by '新密码';

mysql> alter user liubei01@'localhost' identified by 'Liubei@123456'; ###修改用户liubei01密码
Query OK, 0 rows affected (0.00 sec)

mysql> 

💦 方式二、使用set语句修改普通用户密码

####语法####
set password for '用户名'@'用户地址' ='新密码';

mysql> set password for 'liubei01'@'localhost' ='Liubei@123456';  ###修改用户liubei01密码
Query OK, 0 rows affected (0.01 sec)

mysql> 

💦 方式三、使用update语句修改普通用户密码

适用于Mysql 5.7 ,在Mysql 8.0中不再适用(会报错),Mysql 8.0 版本移除了password加密方法。

####语法#### 
update mysql.user set authentication_string =PASSWORD("新密码") where user ='用户名' and host='主机名';

mysql> update mysql.user set authentication_string =PASSWORD("Liubei@123456") where user ='liubei01' and host='localhost';

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '("Liubei@123456") where user ='liubei01' and host='localhost'' at line 1
mysql> 

1.6 🍃 用户密码管理

mysql密码管理只针对使用mysql授权插件的账号,插件有(mysql_native_password、sha256_password、caching_sha2_password)。

⛳ 密码过期—要求定期修改密码

密码过期策略可以是全局的,也可单独设置账号过期策略。过期策略可手动设置,也可建立自动过期策略。

💦 方式一、手动设置密码过期策略立即过期—某个账户

使用 alter user 用户名 password EXPIRE语句设置,用户可以正常登录,但无法查询,只有设置新密码后才能正常使用。

####语法####
alter user 用户名@'用户地址' password EXPIRE;  
alter user liubei01@'localhost' password EXPIRE;

mysql> alter user liubei01@'localhost' password EXPIRE; ###手动设置liubei01用户密码过期
Query OK, 0 rows affected (0.00 sec)

mysql> 

在这里插入图片描述

💦 方式二、手动设置密码过期策略—全局

如果密码使用时间大于允许使用的时间,服务器会自动设置过期。

mysql 使用default_password_lifetime 系统变量建立全局密码过期策略。默认值为0–表示禁用密码过期,值为N—表示允许的密码生存周期,密码需要每隔N天修改。

🌿 1、使用sql语句更改default_password_lifetime 值,并持久化

 ## 建立全局密码过期策略,每隔180天过期
 
mysql> set persist default_password_lifetime = 180;  
Query OK, 0 rows affected (0.00 sec)

mysql> 

🌿 2、配置my.cnf文件

[mysqld]

## 建立全局密码过期策略,每隔180天过期 
persist default_password_lifetime = 180

💦 方式三、手动设置密码过期策略—指定时间过期

数据库用户账号可以沿用全局密码过期策略,也可单独设置,在create user 或者alter user 语句上加上PASSWORD EXPIRE 选项即可实现单独设置策略。

🍀 1、设置180天过期

#####语法#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD EXPIRE interval 过期时间 day;

mysql> create user 'liubei02'@'localhost' identified by 'Liubei@123456' PASSWORD EXPIRE interval 180 day;
Query OK, 0 rows affected (0.00 sec)

mysql> 

#####语法#####
alter user '用户名'@'用户地址' PASSWORD EXPIRE interval 过期时间 day;

mysql> alter user 'liubei01'@'localhost' PASSWORD EXPIRE interval 180 day;
Query OK, 0 rows affected (0.00 sec)

mysql> 

🍀 2、设置永不过期

#####语法#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD EXPIRE never;

mysql> create user 'liubei03'@'localhost' identified by 'Liubei@123456' PASSWORD EXPIRE never;
Query OK, 0 rows affected (0.00 sec)

mysql> 

#####语法#####
alter user '用户名'@'主机名' PASSWORD EXPIRE never;

mysql> alter user 'liubei03'@'localhost' PASSWORD EXPIRE never;
Query OK, 0 rows affected (0.00 sec)

mysql> 

🍀 3、沿用全局密码过期策略

#####语法#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD EXPIRE default;

mysql> create user 'liubei04'@'localhost' identified by 'Liubei@123456' PASSWORD EXPIRE default;
Query OK, 0 rows affected (0.00 sec)


#####语法#####
alter user '用户名'@'用户地址' PASSWORD EXPIRE default;

mysql> alter user 'liubei04'@'localhost' PASSWORD EXPIRE default;
Query OK, 0 rows affected (0.00 sec)

mysql> 

⛳ 密码重用限制—不允许使用旧密码

重用策略基于密码的更改数量和使用时间,可以是全局的,也可以是单独的,mysql使用password_historypassword_reuse_interval 系统变量设置密码重用策略,可以在my.cnf 中配置维护,也可使用sql语句改变变量的值并持久化。

  • 如果账号密码限制基于密码的更改数量(password_history):新密码则不能从最近使用过的密码中选择。如:密码更改数量值为3,则新密码不能与最近3个相同。
  • 如果账号密码限制基于密码的使用时间(password_reuse_interval):新密码不能从归定时间选择,如:设置密码重用周期为180天,则新密码不能与最近180天内使用过的密码相同。

💦 方式一、手动设置密码重用策略—全局

🌿 1、使用sql语句

#####语法 不能使用最近5个使用过的密码#####
set persist password_history=数量值

mysql> set persist password_history=5;
Query OK, 0 rows affected (0.00 sec)

#####语法 不能使用最近180天使用过的密码#####
set password_reuse_interval=数量值

mysql> set password_reuse_interval=180;
Query OK, 0 rows affected (0.00 sec)

mysql> 

🌿 2、配置my.cnf文件

[mysqld]

## 不能使用最近5个使用过的密码
password_history=5

## 不能使用最近180天使用过的密码
password_reuse_interval=180

💦 方式二、手动设置密码重用策略—单独设置

#####语法 不能使用最近5个使用过的密码#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD history 5;

mysql> create user 'liubei04'@'localhost' identified by 'Liubei@123456' PASSWORD history 5;
Query OK, 0 rows affected (0.00 sec)

#####语法 不能使用最近5个使用过的密码#####
mysql> alter user 'liubei04'@'localhost' PASSWORD history 5;
Query OK, 0 rows affected (0.00 sec)


#####语法 不能使用最近180天使用过的密码#####
create user '用户名'@'用户地址' identified by '密码' PASSWORD reuse inteval 时间值 day;

mysql> create user 'liubei04'@'localhost' identified by 'Liubei@123456' PASSWORD reuse interval 180 day;
Query OK, 0 rows affected (0.00 sec)

#####语法 不能使用最近180天使用过的密码#####
alter user 用户名'@'主机名'  PASSWORD reuse inteval 时间值 day;

mysql> alter user 'liubei04'@'localhost' PASSWORD reuse interval 180 day;
Query OK, 0 rows affected (0.00 sec)

⛳ 密码强度评估—要求使用高强度密码

查看密码强度相关的配置

mysql> show variables like '%validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

mysql> 

validate_password.check_user_name=ON----检查密码与用户名

validate_password.policy----​用于检查密码 的字典文件的路径名

validate_password.length=8— 密码长度

validate_password.mixed_case_count=1----必须包含1个大写和1个小写

validate_password.number_count=1----必须包含1个数字

validate_password.special_char_count=1----必须包含1个特殊字符

🔻二、Mysql 权限管理

权限即是允许你做的事情,不可以越界,如只有本机登录权限,就不能从其他设备登录,只有select 权限,就不能updateinsert

2.1 🍃 mysql数据库权限列表

mysql> show privileges;
+------------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege                    | Context                               | Comment                                               |
+------------------------------+---------------------------------------+-------------------------------------------------------+
| Alter                        | Tables                                | To alter the table                                    |
| Alter routine                | Functions,Procedures                  | To alter or drop stored functions/procedures          |
| Create                       | Databases,Tables,Indexes              | To create new databases and tables                    |
| Create routine               | Databases                             | To use CREATE FUNCTION/PROCEDURE                      |
| Create role                  | Server Admin                          | To create new roles                                   |
| Create temporary tables      | Databases                             | To use CREATE TEMPORARY TABLE                         |
| Create view                  | Tables                                | To create new views                                   |
| Create user                  | Server Admin                          | To create new users                                   |
| Delete                       | Tables                                | To delete existing rows                               |
| Drop                         | Databases,Tables                      | To drop databases, tables, and views                  |
| Drop role                    | Server Admin                          | To drop roles                                         |
| Event                        | Server Admin                          | To create, alter, drop and execute events             |
| Execute                      | Functions,Procedures                  | To execute stored routines                            |
| File                         | File access on server                 | To read and write files on the server                 |
| Grant option                 | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess   |
| Index                        | Tables                                | To create or drop indexes                             |
...................................................

💦 mysql 权限分布:

权限分布可设置权限
表级权限Select、 Insert、 Update、 Delete、Create 、Drop、Grant、 References、 lndex、 Alter
列级权限Select、 Insert、 Update、References
过程权限Execute、Alter Routine、Grant

2.2 🍃 数据库授权原则

  • 💦 只赋予满足使用的最小权限,如某用户只需select权限,就不授予其他权限。
  • 💦 创建用户时,指定登录主机,一般限制指定ip 或者ip段
  • 💦 为用户设置满足密码复杂度的密码。
  • 💦 定期清理不使用的用户,回收权限或删除用户。

2.3 🍃 数据库授权

用户是数据库的使用者,可以给用户不同权限,控制对数据库的访问,保障数据库安全。

--- with grant option,表示该用户可以将自己的权限授权给别人。

##授权命令1##
grant 权限1,权限2,权限3,权限n on 数据库名称.表名 to '用户名'@'用户地址' with grant option;

##授权命令2 ##
grant all privileges on *.* to '用户名'@'用户地址' with grant option;

mysql> grant select ,update on test01.* to 'liubei'@'%';  ##授权liubei账号select ,update权限

Query OK, 0 rows affected (0.00 sec)

mysql> show grants;   ##查看当前登录用户权限
+----------------------------------------------------+
| Grants for liubei@%                                |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%`                 |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)

mysql> 

可以看到没授权liubei账户delete权限,删除数据报错。

在这里插入图片描述

2.4 🍃 数据库查看权限

  • 查看当前用户权限:
mysql> show grants;
+----------------------------------------------------+
| Grants for liubei@%                                |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%`                 |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)

或
mysql> show grants for current_user;
+----------------------------------------------------+
| Grants for liubei@%                                |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%`                 |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)

或
mysql> show grants for current_user();
+----------------------------------------------------+
| Grants for liubei@%                                |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%`                 |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)
mysql>
  • 查看某用户全局权限:
mysql> show grants for 'liubei'@'%';
+----------------------------------------------------+
| Grants for liubei@%                                |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `liubei`@`%`                 |
| GRANT SELECT, UPDATE ON `test01`.* TO `liubei`@`%` |
+----------------------------------------------------+
2 rows in set (0.00 sec)

mysql> 

2.5 🍃 数据库收回权限

mysql 使用revoke 语句取消用户的某些权限,收回用户不必要的权限,可在一定程度上保证数据库的安全性。

从user表删除用户之前,应先收回想赢用户的权限。

#####语法1 ####
revoke 权限1,权限2,权限n on 数据库名.表名 from `用户名`@`用户地址`;

#####语法2 ####
revoke all privileges on *.* from '用户名'@'用户地址';

mysql> revoke SELECT, UPDATE ON test01.* from `liubei`@`%`;
Query OK, 0 rows affected (0.00 sec)

mysql> revoke all privileges on *.* from `liubei`@`%`;
Query OK, 0 rows affected (0.01 sec)
mysql> 

2.6 🍃 数据库权限表

mysql 服务器通过权限表来控制用户对数据库的访问,权限表存放于mysql表中,其中最重要的是user表,db表,table_priv表、column_priv 和proc_priv 等,启动mysql服务时,会将这些表中权限信息读入内存。

2.7 🍃 数据库访问控制

当mysql允许一个用户执行各种操作时,它将首先核实该用户向MySQL服务器发送的连接请求,然后确认用户的操作请求是否被允许。这个过程称为mysql中的访问控制过程。

mysql的访问控制分为两个阶段: 连接核实阶段和 请求核实阶段。
在这里插入图片描述

🔻三、总结—温故知新

❓ Mysql 数据库用户创建、修改、删除、密码修改
❓ Mysql数据库权限查看、收回、及授权
❓ Mysql数据库权限表及访问控制

👈【上一篇】
💖The End💖 点点关注,收藏不迷路💖
【下一篇】👉
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值