【MySQL】用户管理

👉用户👈

如果我们只能使用 root 用户,这样存在安全隐患。因为 root 用户的权限实在是太高了,一不小心就有可能会从删库到跑路。这时,就需要使用 MySQL 的用户管理。
在这里插入图片描述

用户信息

MySQL 中的用户,都存储在系统数据库 mysql 的 user 表中。所有的用户管理工作全部都是在这张表中进行,所有用户管理工作对应的 SQL,本质其实都是对这个表进行增删查改。

mysql> use mysql;
Database changed

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *4A4A4E1077BBA88E4537392A2D56040FF27F1FC1 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | oj_client     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)

-- 可以通过 desc user 初步查看一下表结构

  • host:表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆,不允许跨网络登录。% 表示可以跨网络登录。
  • user:用户名。
  • authentication_string:用户密码通过 password 函数加密后的密码。
  • *_priv: 用户拥有的权限。

创建用户

语法:

create user '用户名'@'登陆主机/ip' identified by '密码';

案例:

mysql> create user 'Joy'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *4A4A4E1077BBA88E4537392A2D56040FF27F1FC1 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | oj_client     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| localhost | Joy           | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)

  • 如果创建用户时出现错误,可以使用 flush privileges 刷新一下权限。
  • 对于与密码相关的隐私信息,MySQL 是不会保存这些记录的,也就无法通过上翻来找到相关的 SQL 语句。
  • 当我们设置用户的密码后,该密码需要经过 password 函数加密,然后才会保存在数据库中。
  • create 相当于向 user 表中插入一条数据。
    在这里插入图片描述

删除用户

语法:

drop user '用户名'@'主机名';

案例:

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *4A4A4E1077BBA88E4537392A2D56040FF27F1FC1 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | oj_client     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| localhost | Joy           | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)

-- 删除用户时只指定用户名,没有指定可以登录的地方
-- 默认是删除所有地方都可以登录的用户,由于没有这
-- 个用户,所以删除失败
mysql> drop user Joy;
ERROR 1396 (HY000): Operation DROP USER failed for 'Joy'@'%'

mysql> drop user 'Joy'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *4A4A4E1077BBA88E4537392A2D56040FF27F1FC1 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | oj_client     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)

  • 直接使用 delete 语句来删除用户也是可以的。

修改用户密码

语法:

  • 自己改自己密码
set password=password('新的密码');

  • root 用户修改指定用户的密码
set password for '用户名'@'主机名'=password('新的密码');

案例:

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *4A4A4E1077BBA88E4537392A2D56040FF27F1FC1 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | oj_client     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)

mysql> set password for 'oj_client'@'%'=password('12345678');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select host,user,authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| localhost | root          | *4A4A4E1077BBA88E4537392A2D56040FF27F1FC1 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| %         | oj_client     | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)

  • 同样地,修改用户密码可以通过 update 加上 where 子句来实现。

password 函数

password 函数用于生成用户的密码散列值(Hash)。密码散列值是将用户密码通过哈希算法转换成一串不可逆的密文字符串,存储在用户账户的密码列中,而不是以明文形式存储密码。

以下是 password 函数的特点和使用方法:

  • 密码散列算法: MySQL 使用非对称加密算法,使用了单向散列函数来生成密码散列值,无法从散列值逆向推导出原始密码。
  • 密码比对: 在用户登录时,输入的密码会与存储在数据库中的密码散列值进行比对。MySQL 会将输入的密码进行散列后,与数据库中的密码散列值进行比较。如果散列值相同,则密码正确,用户登录成功。
  • 散列值长度: password 函数生成的密码散列值是一个 40 位的十六进制字符串。

远端登录 MySQL

做这个实验之前,你需要自行创建一个可以远程登录 MySQL 的用户,方法参考上方的内容。用户创建好后,然后再将 MySQL 服务的端口号改一改,千万不要开放 3306 端口,因为非常容易被 hacker 攻击,盗取你的数据库。

vim /etc/my.cnf;  # mysql 服务的配置文件

在这里插入图片描述
修改好配置后,需要重启一下 mysqld 服务。

systemctl restart mysqld

在这里插入图片描述
以上的步骤都完成后,打开自己的 PowerShell(开始键 + R,然后输入 PowerShell 即可打开),输入下方的命令进行远程登录。(注:需要在 Windows 上下载 MySQL,下载教程可以自行查询)

# -u 要登录的用户
# -h 要登录的服务器 IP 地址
# -p 密码登录
# -P mysqld 服务的端口号
mysql -u'oj_client' -h'114.132.226.230' -p -P8888

在这里插入图片描述

👉数据库的权限👈

在这里插入图片描述

给用户授权

刚创建的用户没有任何权限。需要给用户授权。

语法:

grant 权限列表 on.对象名 to '用户名'@'登陆位置' [identified by '密码']

说明:

  • 权限列表,多个权限用逗号分开。
grant select on ...
grant select, delete, create on ....
grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限

  • . : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
  • 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
  • identified by可选。 如果用户存在,赋予权限的同时修改密码。如果该用户不存在,就是创建用户。

回收权限

语法:

revoke 权限列表 on.对象名 from '用户名'@'登陆位置';

综合演示

-- 终端 A
-- 查看用户
mysql> select user, host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| oj_client     | %         |
| Test          | localhost |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)

-- 查看特定用户的权限
mysql> show grants for 'Test'@'localhost';
+------------------------------------------+
| Grants for Test@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'Test'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from user where user='Test'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: Test
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
      password_expired: N
 password_last_changed: 2023-07-29 08:29:23
     password_lifetime: NULL
        account_locked: N
1 row in set (0.00 sec)

-- 终端 B 登录 Test 用户,查看数据库只能看到一个
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

-- 终端 A
-- 给 Test 用户赋予 my_db 数据库下所有文件的 select 权限
mysql> grant select on my_db.* to 'Test'@'localhost';
Query OK, 0 rows affected (0.00 sec)

-- 如果 Test 用户没有看到 my_db 数据库,root 用户
-- 可以使用下面的语句刷新一下权限或者 Test 用户重新登录
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

-- 终端 B:Test 用户
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_db              |
+--------------------+
2 rows in set (0.00 sec)

mysql> use my_db;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_my_db |
+-----------------+
| emp             |
| student         |
+-----------------+
2 rows in set (0.01 sec)

mysql> select * from emp;
+----+--------+---------+
| id | name   | sal     |
+----+--------+---------+
|  3 | 王五   | 2999.00 |
|  4 | 赵六   | 2999.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

mysql> select * from student;
+--------+-----+
| name   | age |
+--------+-----+
| 李四   |  28 |
| 王五   |  48 |
+--------+-----+
2 rows in set (0.00 sec)

-- 尝试向 emp 表中插入一条数据和尝试删除 emp 表
-- 可以发现 Test 用户都没有这个权限
mysql> insert into emp values(2, '张三', 10000);
ERROR 1142 (42000): INSERT command denied to user 'Test'@'localhost' for table 'emp'

mysql> drop table emp;
ERROR 1142 (42000): DROP command denied to user 'Test'@'localhost' for table 'emp'

-- root 用户赋予 Test 用户在 my_db 中的所有权限
mysql> grant all on my_db.* to 'Test'@'localhost';
Query OK, 0 rows affected (0.00 sec)

-- 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for 'Test'@'localhost';
+---------------------------------------------------------+
| Grants for Test@localhost                               |
+---------------------------------------------------------+
| GRANT USAGE ON *.* TO 'Test'@'localhost'                |
| GRANT ALL PRIVILEGES ON `my_db`.* TO 'Test'@'localhost' |
+---------------------------------------------------------+
2 rows in set (0.00 sec)

-- Test 用户插入数据
mysql> select * from emp;
+----+--------+---------+
| id | name   | sal     |
+----+--------+---------+
|  3 | 王五   | 2999.00 |
|  4 | 赵六   | 2999.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

mysql> insert into emp values(2, '张三', 10000);
Query OK, 1 row affected (0.01 sec)

mysql> select * from emp;
+----+--------+----------+
| id | name   | sal      |
+----+--------+----------+
|  2 | 张三   | 10000.00 |
|  3 | 王五   |  2999.00 |
|  4 | 赵六   |  2999.00 |
+----+--------+----------+
3 rows in set (0.00 sec)

mysql> delete from emp where id=2;
Query OK, 1 row affected (0.00 sec)

mysql> select * from emp;
+----+--------+---------+
| id | name   | sal     |
+----+--------+---------+
|  3 | 王五   | 2999.00 |
|  4 | 赵六   | 2999.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

-- 回收 Test 在 my_db 数据库上的所有权限
mysql> revoke all on my_db.* from 'Test'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'Test'@'localhost';
+------------------------------------------+
| Grants for Test@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'Test'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)

-- Test 用户
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

👉总结👈

本篇博客主要讲解了如何查看用户信息、创建用户、删除用户、修改用户密码、给用户授权、回收权限等等。以上就是本篇博客的全部内容,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家啦!💖💝❣️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值