7.3 MySQL用户账号管理

7.3.1用户名称和密码

MySQL把账号存储在mysql系统数据库的user表中。一个账号被定义成一个用户名称和能够连接到服务器的客户端主机(群)。
账号都有一个密码。MySQL支持授权插件,也就是说一个账号授权可以使用其他的授权方式。详情见7.3.8。
MySQL使用账号名称和密码的方式与操作系统使用账号名称和密码的方式存在很多不同。

  • 账号名称,被MySQL用来授权,与Windows和Unix操作系统的账号名称(登陆账号)没有关系。在Unix上,很多MySQL客户端默认使用当前Unix账号作为MySQL账号名称,这只是为了方便。默认账号很容易被覆盖,因为客户端程序允许通过-u 或者–user选项来指定任何账号。这就意味着任何一人可以使用任意账号连接到服务器,你不能保证数据库安全除非每个账号都有一个密码。
  • MySQL账号名称限制在32个字符(MySQL5.7.8之前是16个字符)。操作系统账号会有不同的最大长度,比如Unix账号名称经常被限制在8个字符。
    • 对MySQL账号长度的限制是被硬编码在MySQL服务器和客户端上的。通过修改MySQL数据库中表的定义是不起作用的。
    • 你不应该以任何方式改变表的结构,除了使用5.4.7-mysql-upgrade中描述的存储过程。 试图通过任何一种方式重定义MySQL的系统表,都会导致undefined和unsupported错误。服务器会无视这样被更改的行。
  • 为了使用MySQL本身(由mysql-native-plugin授权插件执行)的授权方法来给账号的客户端连接授权,服务器使用user表中存储的密码。如果服务器使用其他插件授权客户端,插件执行授权的方法使用或许不使用user表中存储的密码。在那种情况下,MySQL服务器可能使用外部密码来鉴定用户。
  • 存储在user表中的密码使用插件指定的算法加密。关于MySQL自带的密码hash算法详情请看7.1.2.4-Password-hashing in MySQL。
  • 如果用户名和名称在包括ASCII字符,连接到服务器时可能不考虑字符集设定。当用户名或者密码包含非ASCII字符时,客户端应该调用 带mysql_set_charset_name 和合适的字符集选项的mysql_options() C API方法。只有使用特定的字符集才会使鉴定生效,否则鉴定会失败,除非服务器默认的字符集和鉴权编码时使用的字符集一样。
    标准的MySQL客户端程序支持–default-character-set选项来使mysql_option()方法按刚才描述的方式触发。另外,如在11.1.4中描述的,支持字符集自动识别。对于使用连接器不是基于C API的程序,连接器应该提供一个等同于mysql_option()的替代品。
    注解处理不适用于ucs2,utf16和utf32,这些字符集不允许作为客户端字符集使用。

7.3.2 增加用户账号

创建MySQL账号有两种方式
- 通过使用创建账号和设定密码的账号管理语句,比如create user 和grant,使服务器对相关的grant表进行合适的调整。
- 直接使用insert/update和delete语句来操作MySQL grant表。
比较好的方法是使用账号管理语句,因为这些账号管理语句比直接操作grant表更简洁和更不容易出错。这些语句在14.7.1中描述。不建议直接操作grant表。
另一个选择是使用图形化工具MySQL工作台。同时,很多第三方的程序也提供账号管理的能力。phpMyAdmin就是这样一款软件。
下面是一个创建账号的例子:

mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost'
-> WITH GRANT OPTION;
mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%'
-> WITH GRANT OPTION;
mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass';
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> CREATE USER 'dummy'@'localhost';

上面语句创建的账号有如下特性:
- 两个账号有用户名fineley和密码some_pass。它们都是有全部权限的超级账号。‘fineley@localhost’账号只有从localhost主机连接时能使用。‘fineley@%’账号使用%表示所有主机,所有这个账号可以从任意主机去连接服务器。
如果localhost主机存在匿名账号,那么‘fineley@localhost’是必需的。如果没有‘fineley@localhost’账号,当fineley账号从localhost连接时,匿名首先起作用,fineley会被当作匿名账号。原因是匿名账号比‘fineley@%’有一个更特定的主机名,这样匿名账号在user表排序中更靠前。(user表排序在7.2.4中讨论)
- ‘admin@localhost’账号的密码是admin_pass。它被赋予RELOAD和PROCESS管理权限。这些权限使admin用户能够执行mysqladmin reload,mysqladmin refresh,mysqladmin flush-xxx和mysqladmin processlist命令。没有存取任何数据库的权限。你可以通过使用grant语句增加这样的权限。
- ‘dummy@localhost’账号没有密码,没有权限。

为了查看一个账号的权限,可以使用show grants命令:
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
+-----------------------------------------------------+

为了查看一个账号的非权限信息,可以使用show create user命令:
mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost'
IDENTIFIED WITH 'mysql_native_password'
AS '*67ACDEBDAB923990001F0FFB017EB8ED41861105'
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK

7.3.3 移除用户账号

使用drop user语句来移除账号。在14.1.7.3中描述。比如
mysql> DROP USER 'jeffrey'@'localhost';

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值