Loading... # [老板:让你添加一个mysql用户并给予权限这么费劲吗?](https://learnku.com/articles/58035) 前言 今天,程序员小王被老板训了一顿,还被扣了 1k 的工资,原因就是因为有一个项目已经上线,客户这边要求给数据库新添加一个用户,并给予用户某些权限,但是小王由于对这么方面有点生疏,都是现百度现实现,导致工作效率低,引发了老板的不满。 小王痛定思痛,下决心要搞明白 mysql 的创建用户及授权,经过查阅各种资料学习, 小王对此了解的八九不离十了,从而在老板面前硬了起来…… 一、新建一个用户 老板:给我新建一个用户joytom,密码设置为123321,并任意远程主机都能访问,五分钟完成,实现不了就给我提桶走人! 小王会心一笑,对创建用户的命令早已滚瓜烂熟了,于是熟练的操作了起来: 1、创建用户命令: CREATE USER ‘username‘@’host’ IDENTIFIED BY ‘password’; 属性名 含义 username 登陆用户名 host 指定可访问的 ip,如果指定所有 ip 都能访问,将其设为通配符 % 即可。 password 登陆密码,如果密码为空则无需密码 2、创建用户 mysql> CREATE USER 'joytom'@'%' IDENTIFIED BY '123321'; Query OK, 0 rows affected (0.00 sec) 查看一下是否创建成功: mysql> select user,host from user; +----------+---------------+ | user | host | +----------+---------------+ | copytest | % | | joytom | % | | test | % | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | vm-8-5-centos | | root | vm-8-5-centos | +----------+---------------+ 10 rows in set (0.00 sec) 3、从另一台服务器上远程登录一下: [root@instance-lzmtqrkn ~]# mysql -h 创建用户的服务器公网ip -P 3306 -u joytom -p123321 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 784 Server version: 5.6.49-log Source distribution Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. 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> show databases; +--------------------+ | Database | +--------------------+ | information_schema | +--------------------+ 1 row in set (0.03 sec) 查看一下数据库,发现是没有权限的,只能看到 information_schema 数据库。 二、为用户授权 创建完用户后…… 老板:好,比以前有进步了,那你再给joytom这个用户设置一个权限,只允许查询和修改copytest数据库中的student表。 小王信手拈来,又熟练的操作了一波: 1、给用户授权命令 grant privileges on database.tablename to “username”@’host’; privileges:用户的操作权限,如 SELECT,INSERT,UPDATE 等,如果要授予所的权限则使用 ALL。 属性名 含义 privileges 用户的操作权限,如 SELECT,INSERT,UPDATE 等,如果要授予所的权限则使用 ALL。 database 如果不指定数据库,直接 *.* 即可,如果指定数据库但不指定表名,则 database.* 即可。 username 登陆的用户名 host 给予授权的主机 ip,例如我想让用户A的ip使用joytom用户所授予的权限,但是不想让用户B的ip来使用joytom用户的权限。 2、给 joytom 用户授可查、改的权限。 mysql> grant select,update on copytest.student to "joytom"@'%'; Query OK, 0 rows affected (0.00 sec) 3、另一台服务器去测试: 发现能看到 copytest 数据库: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | copytest | +--------------------+ 2 rows in set (0.04 sec) 查看一下 copytest 数据库中的 student 表: mysql> use copytest; Database changed mysql> select * from student; +----+------+ | id | name | +----+------+ | 1 | 王 | | 2 | 李 | | 3 | 张 | +----+------+ 3 rows in set (0.04 sec) 修改一下 student 表: mysql> update student set name = '小王' where id = 1; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from student; +----+--------+ | id | name | +----+--------+ | 1 | 小王 | | 2 | 李 | | 3 | 张 | +----+--------+ 3 rows in set (0.04 sec) 那删除一下 student 表中的数据呢: mysql> delete from student where id = 1; ERROR 1142 (42000): DELETE command denied to user 'joytom'@'xxxxxx' for table 'student' 发现没有删除的权限,只能进行查询和修改。 4、在给 joytom 用户增加一个查看视图的权限 mysql> grant SHOW VIEW on copytest.student to "joytom"@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) 之前是只有查询和修改的权限,现在在查看一下: mysql> show grants for 'joytom'@'%'; +-------------------------------------------------------------------------------------------------------+ | Grants for joytom@% | +-------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'joytom'@'%' IDENTIFIED BY PASSWORD '*437F1809645E0A92DAB553503D2FE21DB91270FD' | | GRANT SELECT, UPDATE, SHOW VIEW ON `copytest`.`student` TO 'joytom'@'%' | +-------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) 发现,已经有了查看视图的权限。 三、撤销用户权限 老板:咳咳,很好,现在 joytom 不是有三个权限了么(查询,修改,查询视图),那你把查询视图的权限给去掉,只留查询和修改。 小王心中暗喜,这我都学了,很基础的啊…… 1、撤销用户权限命令 revoke privileges ON database.tablename FROM ‘username‘@’host’; 撤销(revoke)的和授予(grant)的基本一样,除了 revoke(对应 grant)和 from(对应 to) 2、撤销 joytom 用户的查看视图的权限 mysql> revoke SHOW VIEW on copytest.student from "joytom"@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 再次查看: mysql> show grants for 'joytom'@'%'; +-------------------------------------------------------------------------------------------------------+ | Grants for joytom@% | +-------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'joytom'@'%' IDENTIFIED BY PASSWORD '*437F1809645E0A92DAB553503D2FE21DB91270FD' | | GRANT SELECT, UPDATE ON `copytest`.`student` TO 'joytom'@'%' | +-------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) 发现已经没了查看视图的权限。 grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。 四、删除一个用户 老板:把 joytom 这个用户删掉让我看看。 小王:好嘞,40 秒完事。 1、删除用户命令 drop user username@host 2、删除用户 先查看一下现在的所有用户: mysql> select user,host from user; +----------+---------------+ | user | host | +----------+---------------+ | copytest | % | | joytom | % | | test | % | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | vm-8-5-centos | | root | vm-8-5-centos | +----------+---------------+ 10 rows in set (0.00 sec) 删除 joytom: mysql> drop user joytom@'%'; Query OK, 0 rows affected (0.00 sec) 再次查看,发现已经没了 joytom 这个用户: mysql> select user,host from user; +----------+---------------+ | user | host | +----------+---------------+ | copytest | % | | test | % | | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | vm-8-5-centos | | root | vm-8-5-centos | +----------+---------------+ 10 rows in set (0.00 sec) 五、修改用户的密码 老板:把 joytom 这个用户密码修改一下。 小王:好嘞老板。 1、修改用户密码命令 set PASSWORD FOR ‘username‘@’%’ = PASSWORD (‘要修改的密码’) 2、修改用户 SET PASSWORD FOR 'joytom'@'%' = PASSWORD('123123'); 六、密码过期和锁定用户 老板大喜:非常好非常好,加薪 2k,继续努力,另外给其它同事讲一下密码过期和锁定用户的问题。 感谢老板,我会继续努力,我这就去整理一下课件。 1、关于密码过期 在 MySQL5.6.6 版本起,增加了 password_expired 功能,它允许设置 MySQL 数据库用户的密码过期时间。这个特性已经添加到 mysql.user 数据表,它的默认值是”N”,表示已禁用密码过期功能 强制设置为密码过期: mysql> ALTER USER 'joytom'@'%' PASSWORD EXPIRE; Query OK, 0 rows affected (0.00 sec) 强制设置密码过期后,虽然能够登陆,但是一切权限都为空了。 2、关于 mysql5.7 锁定用户 在创建的时候锁定用户: CREATE USER 'username'@'host' account unlock; 已存在的时候锁定用户: ALTER USER 'joytom'@'%' ACCOUNT LOCK; 解锁账号: ALTER USER 'joytom'@'%' ACCOUNT UNLOCK 七、权限常用关键字 老板:现在你对 mysql 的权限管理掌握的还算可以了,咳咳,今天下班前给我整理一个权限常用关键字,整理不好就加会班吧。 小王想,幸亏这个我在学的时候就已经整理过啊,看样今天不用加班了! 最后修改:2023 年 08 月 12 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏