这是我参与更文挑战的第 23 天,活动详情查看:更文挑战
一名致力于在技术道路上的终身学习者、实践者、分享者,一位忙起来又偶尔偷懒的原创博主,一个偶尔无聊又偶尔幽默的少年。
欢迎各位掘友们微信搜索「杰哥的IT之旅」关注!
原文链接:MySQL | MySQL 数据库系统(三)- 数据库的用户授权
MySQL 数据库系统的 root 用户账号其实都是拥有对所有库、所有表的全部权限,频繁使用 root 账户,同时也会给数据库服务器带来一定的安全隐患。因此,我们在实际工作中,通常会建立一些权限低的用户,来负责某一部分库及表的管理与维护,甚至对查询、修改、删除等操作在详细做进一步的限制,从而将数据库服务器的安全降至最低。
当指定的用户名不存在时,grant 语句将会创建新的用户。否则,将用于修改用户信息。
grant 权限列表 on 库名.表名 to 用户名@来源地址 [ identified by '密码'] 复制代码
权限列表
:用于列出授权使用的各种数据库操作,以逗号
进行分隔。例如:select
、insert
、update
,使用all
表示所有权限,可授权执行任何操作。
库名.表名
:用于指定授权操作的库和表的名称,其中可使用通配符*
,使用auth.*
表示授权操作的对象为auth
库中的所有表。
用户名@来源地址
:用于指定用户名称和允许访问的客户机地址。来源地址可以是域名
IP 地址
%
表示某个区域或网段中的所有地址。例如:%.google.com
和172.16.123.%
等;
IDENTIFIED BY
:用于设置用户连接数据库时所使用的密码字符串。新建用户时,可省略IDENTIFIED BY
部分,用户密码将为空。
例如:你要执行以下操作添加一个名为xiaojack
的数据库用户,并允许从本机进行访问,对auth
库中的所有表具有查询权限,密码为123.com
。
使用grant
语句授权的用户记录,会保存到mysql
库的user
、db
、host
、tables_priv
等相关表中,无须刷新即可生效。
mysql> grant select on auth.* TO 'xiaojack'@'localhost' identified by '123.com'; Query OK, 0 rows affected (0.10 sec) 复制代码
切换到其他shell
终端,可以将用户xiaojack
的身份来连接数据库。
当执行授权的数据库操作时将被允许,而执行非授权的数据库操作时将被拒绝。
允许用户xiaojack
查看auth
库中的users
表数据,但禁止查询其他库中的数据。
[root@localhost ~]# mysql -u xiaojack -p Enter password: ······ // 省略部分内容 mysql> select * from auth.users; +-----------+-------------------------------------------+ | user_name | user_passwd | +-----------+-------------------------------------------+ | jacktian | *B2B366CA5C4697F31D4C55D61F0B17E70E5664EC | +-----------+-------------------------------------------+ 1 row in set (0.00 sec) mysql> select * from mysql.user; ERROR 1142 (42000): SELECT command denied to user 'xiaojack'@'localhost' for table 'user' 复制代码
在企业,通常情况下,数据库服务器与网站服务器是独立的。当我们在使用MySQL数据库
时,根据实际情况,应当建立新用户授权,允许授权用户从网站服务器来进行访问数据库服务器。创建一个库,并授予所有权限,来限制访问的来源IP地址
。
新建一个名为:mongodb
库,并授权从IP地址
为192.168.3.123
的主机连接,用户名为:dbuser
、密码为:pwd@123.com
,允许在mongodb
库中执行所有操作。
mysql> create database mongodb; Query OK, 1 row affected (0.15 sec) mysql> grant all on mongodb.* to 'dbuser'@'192.168.3.123' identified by 'pwd@123.com'; Query OK, 0 rows affected (0.05 sec) 复制代码
通过for
子句指定查看的用户对象,且指定的用户对象必须与授权使用的用户对象是一致的。
show grants for 用户名@来源地址 复制代码
例如:执行以下操作,可查看用户dbuser
从主机192.168.3.123
访问数据库时的授权信息。
USAGE
权限对应的授权记录中包含了用户的连接密码字符。
mysql> show grants for 'dbuser'@'192.168.3.123'; +-------------------------------------------------------------------------------------------------------------------+ | Grants for dbuser@192.168.3.123 | +-------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'dbuser'@'192.168.3.123' IDENTIFIED BY PASSWORD '*30D9E97027C9D62E7840B4BABB3F3E55D59C0B0E' | | GRANT ALL PRIVILEGES ON `mongodb`.* TO 'dbuser'@'192.168.3.123' | +-------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.01 sec) 复制代码
撤销权限以后,用户依然可以连接到MySQL数据库
,但禁止执行对应的数据库相关操作。
revoke 权限列表 on 数据库名.表名 from 用户名@来源地址 复制代码
执行如下操作,可撤销用户xiaojack
从本机访问数据库auth
的所有权限。
mysql> revoke all on auth.* from 'xiaojack'@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> show grants for 'xiaojack'@'localhost'; +-----------------------------------------------------------------------------------------------------------------+ | Grants for xiaojack@localhost | +-----------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'xiaojack'@'localhost' IDENTIFIED BY PASSWORD '*AC241830FFDDC8943AB31CBD47D758E79F7953EA' | +-----------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 复制代码
手把手教你在 Linux 环境下部署 MySQL 数据库!
MySQL | MySQL 数据库系统(二)- SQL语句的基本操作
原创不易,如果你觉得这篇文章对你有点用的话,麻烦你为本文点个赞、评论或转发一下,因为这将是我输出更多优质文章的动力,感谢!
对了,掘友们记得给我点个免费的关注哟!防止你迷路下次就找不到我了。
我们下期再见!