Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql创建、删除到权限控制

MySQL从创建、删除到权限控制全攻略( 用户管理)

作者:刘仁德91

MySQL用户管理的核心就是 CREATE USER 创建、GRANT/REVOKE 授权、DROP USER 删除‌ 这三个动作,配合主机限制和最小权限原则,就能把访问控制做到位,下面给大家介绍MySQL从创建、删除到权限控制全攻略,感兴趣的朋友一起看看吧

一、用户管理概述

MySQL 的用户管理也是按照表结构进行管理的,因为 MySQL 需要记录哪些用户有什么权限。
在安装 MySQL 时,即使没有创建数据库,默认情况下仍然会有系统自带的数据库。其中一个叫做 mysql 的数据库,里面有一张 user 表,这张表就是用来管理用户的。

可以通过以下命令查看:

select * from user\G;

user 表中的关键字段:

因此,在 MySQL 下新建一个用户,实际上就是在这张表里面填写 User、Host、authentication_string(密码)以及其他权限字段。
比较粗暴的方式可以通过 insert 插入,但过于麻烦,所以推荐使用专门的用户管理语句。

二、创建用户

语法:

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

注意:登陆主机/ip 必须写。

案例:

mysql> create user 'whb'@'localhost' identified by '12345678';
Query OK, 0 rows affected (0.06 sec)

这个密码在进行保存的过程中,实际上会通过 hash 的方式加密后再填写到 authentication_string 字段。

查看用户:

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

此时便可以使用新账号新密码进行登录。

备注:
可能实际在设置密码的时候,因为 MySQL 本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

解决方案:查看密码设置相关要求:

SHOW VARIABLES LIKE 'validate_password%';

关于新增用户这里,需要注意,不要轻易添加一个可以从任意地方登录的 user。

注意:使用新创建的用户是不可以远程进行登录的,因为该用户的 HOST 字段是 localhost,不是远程机器。

三、删除用户

语法:

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

示例:

mysql> select user,host,authentication_string from user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | %         | *A2F7C9D334175DE9AF4DB4F5473E0BD0F5FA9E75 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| whb           | localhost | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 |
+---------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
mysql> drop user whb; -- 尝试删除
ERROR 1396 (HY000): Operation DROP USER failed for 'whb'@'%' 
-- 直接给个用户名,不能删除,它默认是%,表示所有地方可以登陆的用户
mysql> drop user 'whb'@'localhost'; -- 删除用户,所以要加上 ip 地址
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host,authentication_string from user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | %         | *A2F7C9D334175DE9AF4DB4F5473E0BD0F5FA9E75 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

在删除老用户后,再新建用户的时候,不在明确写 ip 号。
即使写了明确的 ip,在绝大多数情况下也是没有什么实际用处的,因为 ip 是局域网 ip,没法在公网中找到;即使是公网 ip,其实也不建议这样写。
所以在 ip 那里写上 %,也就是:

create user 'whb'@'%' identified by '密码';

就代表任何机器都可以登录这个用户。

四、修改用户密码

语法:

自己改自己密码:

set password=password('新的密码');

其实就是 update。

root 用户修改指定用户的密码:

set password for '用户名'@'主机名'=password('新的密码');

示例:

mysql> select host,user, authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root          | *A2F7C9D334175DE9AF4DB4F5473E0BD0F5FA9E75 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | whb           | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)
mysql> set password for 'whb'@'localhost'=password('87654321');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select host,user, authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host      | user          | authentication_string                     |
+-----------+---------------+-------------------------------------------+
| %         | root          | *A2F7C9D334175DE9AF4DB4F5473E0BD0F5FA9E75 |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | whb           | *5D24C4D94238E65A6407DFAB95AA4EA97CA2B199 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)

五、数据库权限

MySQL 数据库提供的权限列表:

权限列上下文
CREATECreate_priv数据库、表或索引
DROPDrop_priv数据库或表
GRANT OPTIONGrant_priv数据库、表或保存的程序
REFERENCESReferences_priv数据库或表
ALTERAlter_priv表
DELETEDelete_priv表
INDEXIndex_priv表
INSERTInsert_priv表
SELECTSelect_priv表
UPDATEUpdate_priv表
CREATE VIEWCreate_view_priv视图
SHOW VIEWShow_view_priv视图
ALTER ROUTINEAlter_routine_priv保存的程序
CREATE ROUTINECreate_routine_priv保存的程序
EXECUTEExecute_priv保存的程序
FILEFile_priv服务器主机上的文件访问
CREATE TEMPORARY TABLESCreate_tmp_table_priv服务器管理
LOCK TABLESLock_tables_priv服务器管理
CREATE USERCreate_user_priv服务器管理
PROCESSProcess_priv服务器管理
RELOADReload_priv服务器管理
REPLICATION CLIENTRepl_client_priv服务器管理
REPLICATION SLAVERepl_slave_priv服务器管理
SHOW DATABASESShow_db_priv服务器管理
SHUTDOWNShutdown_priv服务器管理
SUPERSuper_priv服务器管理

5.1 给用户授权

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

语法:

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

说明:

案例:

使用 root 账号,终端 A:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| 57test             |
| bit_index          |
| ccdata_pro         |
| innodb_test        |
| musicserver        |
| myisam_test        |
| mysql              |
| order_sys          |
| performance_schema |
| scott              |
| sys                |
| test               |
| vod_system         |
+--------------------+
14 rows in set (0.00 sec)
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| account        |
| student        |
| user           |
+----------------+
3 rows in set (0.01 sec)
-- 给用户 whb 赋予 test 数据库下所有文件的 select 权限
mysql> grant select on test.* to 'whb'@'localhost';
Query OK, 0 rows affected (0.01 sec)

使用 whb 账号,终端 B:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
-- 暂停等 root 用户给 whb 赋完权之后,再查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               | -- 赋完权之后,就能看到新的表
+--------------------+
2 rows in set (0.01 sec)
mysql> use test;
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| account        |
| student        |
| user           |
+----------------+
3 rows in set (0.00 sec)
mysql> select * from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
| 2  | 李四   | 321.00  |
| 3  | 王五   | 5432.00 |
| 4  | 赵六   | 543.90  |
| 5  | 赵六   | 543.90  |
+----+--------+---------+
4 rows in set (0.00 sec)
-- 没有删除权限
mysql> delete from account;
ERROR 1142 (42000): DELETE command denied to user 'whb'@'localhost' for table 'account'

备注:查看特定用户现有权限

mysql> show grants for 'whb'@'%';
+-----------------------------------------------+
| Grants for whb@%                              |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO 'whb'@'%'               |
| GRANT ALL PRIVILEGES ON `test`.* TO 'whb'@'%' |
+-----------------------------------------------+
2 rows in set (0.00 sec)
mysql> show grants for 'root'@'%';
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

注意:如果发现赋权限后没有生效,执行如下指令:

flush privileges;

5.2 回收权限

语法:

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

库.对象名 中的对象名就是具体的某个表。

示例:

回收 whb 对 test 数据库的所有权限。

root 身份,终端 A:

mysql> revoke all on test.* from 'whb'@'localhost';
Query OK, 0 rows affected (0.00 sec)

whb 身份,终端 B:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

六、注意事项总结

到此这篇关于MySQL从创建、删除到权限控制全攻略( 用户管理)的文章就介绍到这了,更多相关mysql创建、删除到权限控制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文