14.7.1.2 CREATE USER Syntax

单击此处查看原文

以下是MySQL 5.7.6及以上版本CREATE USER句法

CREATE USER [IF NOT EXISTS]
user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
[password_option | lock_option] ... user:
'详情参见: Section 7.2.3, “Specifying Account Names” https://dev.mysql.cm/doc/refman/5.7/en/account-names.html' auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED BY PASSWORD 'hash_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'hash_string'
} tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
} resource_option: {
MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
} password_option: {
PASSWORD EXPIRE
| PASSWORD EXPIRE DEFAULT
| PASSWORD EXPIRE NEVER
| PASSWORD EXPIRE INTERVAL N DAY
} lock_option: {
ACCOUNT LOCK
| ACCOUNT UNLOCK
}

以下是MySQL 5.7.6以前版本CREATE USER句法

CREATE USER
user [auth_option] [, user [auth_option]] ... user:
'详情参见: Section 7.2.3, “Specifying Account Names”) https://dev.mysql.com/doc/refman/5.7/en/account-names.html' auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED BY PASSWORD 'hash_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin AS 'hash_string'
}

CREATE USER 语句将会创建一个新的MySQL账户。它允许账户认证属性被建立。在MySQL 5.7.6中,它也可能建立认证、SSL/TLS、资源限制、账户密码过期时间、账户锁定和解锁等属性。

一个账户在建立之初是没有权限的。

使用 CREATE USER 你必须有全局的 CREATE USER 权限,或者有对mysql数据库进行 INSERT 的权限。当设置了 read only 系统变量时, CREATE USER 还需要 SUPER 权限。

如果你尝试创建一个已经存在的账户将会触发异常。

MySQL 5.7.8 中 ,可以使用IF NOT EXISTS 语句。这样当尝试创建已有用户时,会抛出警告而非异常。

每个账户, CREATE USER 语句会在mysql.user表中创建一条新纪录。这条记录会reflects(反射?还是要翻译为反映?)在语句中指定的账户属性。没有被指定的账户属性将会得到一个默认值。

例1:使用默认的认证插件来创建一个账户并设置默认密码。如果设置密码已经过期,那么用户必须在首次连接mysql服务器的时候重新设置密码。

CREATE USER 'jeffrey'@'localhost'
IDENTIFIED BY 'new_password' PASSWORD EXPIRE;

例2:使用 sha256_password 认证插件创建一个账户并设置默认密码。设置每180天必须更新密码。

CREATE USER 'jeffrey'@'localhost'
IDENTIFIED WITH sha256_password BY 'new_password'
PASSWORD EXPIRE INTERVAL 180 DAY;

要点

在某些情况下, CREATE USER 的使用可能会被记录在服务器日志中,或者记录在客户端的历史文件中,比如:~/.mysql_history。这意味着用户的明文密码会被任何有权阅读日志的人看到。关于服务器日志产生的条件和如何控制它,参见Section 7.1.2.3, “Passwords and Logging"。客户端的参见Section 5.5.1.3, “mysql Logging"

其他设置密码和认证插件的相关信息,参见Section 7.3.5, “Assigning Account Passwords”, and Section 7.3.8, “Pluggable Authentication”.

在MySQL 5.7.6中创建用户

每个账户名的格式,参见Section 7.2.3, “Specifying Account Names”

例如:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

如果省略了账户名中的主机名(localhost)部分,会默认为 %

上述语句,账户名称('jeffrey'@'localhost')后面可以带上一个可选项 *auth_option * ,它指定了该账户将会如何被认证。这些values允许指定账户的认证插件和资格证明(密码)。每个 auth_option 值只会在用户命名账户之前生效。

在用户范式中,语句可能会包含可选的设置:SSL/TLS, 资源限制, 密码过期, 锁定属性。所有这些可选项在当前语句中都是全局的,可以应用到每个命名账户中。

例如:以下的语句将会创建两个账户,每个都使用默认的认证插件和默认密码。每个账户若要被允许,在连接时必须使用一个合法的X509证书,并且要高达 60次查询/每小时。在最初每个账户都是被锁定的,所以它们只是有效的占位符,在管理员解锁它们之前都无法使用。

CREATE USER
'jeffrey'@'localhost' IDENTIFIED BY 'new_password1',
'jeanne'@'localhost' IDENTIFIED BY 'new_password2'
REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60
ACCOUNT LOCK;

如果省略可选项,它们将会使用如下的默认值:

  • Authentication:认证插件会被default_authentication_plugin系统变量定义,并且赋空密码。
  • SSL/TSL:NONE
  • Resource limits:Unlimited
  • Password expiration:PASSWORD EXPIRE DEFAULT
  • Account locking:ACCOUNT UNLOCK

Authentication Options

一个账户名之后可能会带上可选项 authentication option 来指定账户认证插件、密码,或者两个都有:

  • auth_plugin 命名了一个认证插件。这个插件名可以是一个引用字符串或者不带引号的标识符。插件名被存储在mysql.user表的plugin列中。
  • auth_string 或者 hash_string 指定了账户密码。无论是明文或者散列,认证插件都分别规定了一个期望的格式。密码将会被存储在mysql.user表的authentication_string 列中。

CREATE USER 语句允许这些 auth_option 句法:

  • IDENTIFIED BY 'auth_string'

    设置了账户认证插件为默认,hashes了明文密码 'auth_string' ,并且存储在mysql.user表中。(那个hashes不会翻啊,是打乱吗?哈哈哈)

  • IDENTIFIED BY PASSWORD 'hash_string'

    设置了账户认证拆件为默认,设置了哈希密码 'hash_string' ,并且存储在mysql.user表中,这里假定了hash字符串符合了插件的期望格式。

注意

此句法已经过时,将会在下个MySQL发行版中移除。

  • IDENTIFIED WITH auth_plugin

    设置了账户认证插件为 auth_plugin ,并将密码清空,存储在mysql.user表中。

  • IDENTIFIED WITH auth_plugin BY 'auth_string'

    设置了账户认证插件为 auth_plugin ,hashes了明文密码 auth_string ,存储在mysql.user表中。

  • IDENTIFIED WITH auth_plugin AS 'hash_string'

    设置了账户认证插件为 auth_plugin ,设置了哈希密码 'hash_string' ,存储在mysql.user表中,这里假定了hash字符串符合了插件的期望格式。

除非default_authentication_plugin系统变量被设置,否则默认的插件就是mysql_native_password。更多详情,参见Section 7.5.1, “Authentication Plugins”

例1:指定了明文密码,使用默认插件:

CREATE USER 'jeffrey'@'localhost'
IDENTIFIED BY 'mypass';

例2:指定了认证插件,以及明文密码:

CREATE USER 'jeffrey'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'mypass';

SSL/TLS Options

MySQL可以检查X509证书特性,除了基于用户名和密码的通用证书。详情参见Section 7.4, “Using Secure Connections”

为MySQL账户指定SSL/TSL-related option,要使用REQUIRE语句,它可以用来指定一个或者多个tls_option

CREATE USER 允许如下 tls_option :

  • NONE

    表示这个账号不带SSL或者X509证书的要求。如果用户名和密码合法,非加密连接就会被允许。不过如果在客户端设置中如果有适合的证书和密钥文件,加密连接也是可以被使用的。

  • SSL

    通知服务端这个账户只允许加密连接。

    CREATE USER 'jeffrey'@'localhost' REQUIRE SSL;

在MySQL 5.7.3中,一个客户端只有在指定了 --ssl之后才能获得加密连接,如果一个加密连接无法被建立,那本次的尝试连接就会失败。在MySQL 5.7.3之前的版本中,客户端必须指定 --ssl-ca--ssl-key--ssl-cert中的其中一个参数才行。如果既不指定 --ssl-cs也不指定 --ssl-capath,那客户端就不会验证服务器证书。

  • X509

    需要客户端必须有合法的证书,但是确切的证书、发行人、主题都不重要。唯一的要求是它需要能够从CA证书中验证它的签名。使用X509证书总是默认加密,所以SSL选项就不重要了。
    CREATE USER 'jeffrey'@'localhost' REQUIRE X509;

客户端必须指定--ssl-key--ssl-cert选项来进行连接。(它推荐而非必须 --ssl-ca也要被指定,使得公共证书提供者在服务器可以被验证)。发行人和主题也是如此,因为REQUIRE选项隐含了X509的这些要求。

  • ISSUER 'issuer'

    在尝试连接的时候会加以限制,用户必须提供一份由认证中心(CA) issurr 提供的合法X509证书。如果客户端提供了一份合法但是认证中心不一致的证书,服务器会拒绝连接。使用X509证书总是默认加密,所以SSL选项就不是必填项了。

    因为ISSUER隐含了X509的要求,客户端必须指定--ssl-key--ssl-cert选项来进行连接。(它推荐而非必须 --ssl-ca也要被指定,使得公共证书提供者在服务器可以被验证)。

  • SUBJECT 'subject'

    在尝试连接的时候会加以限制,因此客户端必须提供一份包含 subject 主题的合法X509证书。如果客户端提供了一份合法但是不包含此主题的证书,服务器会拒绝连接。使用X509证书总是默认加密,所以SSL选项就不是必填项了。

    因为SUBJECT隐含了X509的要求,客户端必须指定--ssl-key--ssl-cert选项来进行连接。(它推荐而非必须 --ssl-ca也要被指定,使得公共证书提供者在服务器可以被验证)。

    CREATE USER 'jeffrey'@'localhost'
    REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/emailAddress=client@example.com';

MySQL会对语句中主题的值跟证书进行简单的字符串比对,所以字母大小写和语句成分的顺序一定要与证书中给出的完全一致。

>**注意**
>对于 *emailAddress* ,参见 *REQUIRE ISSUER* 的**注意**内容。
  • CIPHER 'cipher'

    加密连接会请求一个指定的加密方式。这个选项是必须的,用于确保密码和密钥的长度以及强度。如果老算法使用的是短的加密密码,SSL本身可以比较弱。
    CREATE USER 'jeffrey'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

SUBJECTISSUERCIPHER 可以在 REQUIRE 语句中被组合起来:

SQL CREATE USER 'jeffrey'@'localhost' REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL demo client certificate/ CN=client/emailAddress=client@example.com' AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL/CN=CA/emailAddress=ca@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';

每个选项的顺序无所谓,但是都不可以被指定两次。AND 关键字是可选的。

Resource-Limit Options

一个账户在访问服务器资源时,可能被加以限制,详情参见:Section 7.3.4, “Setting Account Resource Limits”。写语句时,使用 WITH 语句来指定一个或者多个 resource_option

CREATE USER 允许下列的 resource_option

  • MAX_QUERIES_PER_HOUR count, MAX_UPDATES_PER_HOUR count, MAX_CONNECTIONS_PER_HOUR count

    这些选项限制了一个账户的每小时查询的数量、每小时更新数量,以及每小时对服务器的连接数量(如果是从查询缓存中出来的数据,则不受 MAX_QUERIES_PER_HOUR 的限制)。如果 count 为0(默认为0),意味着此账户的查询无限制。

  • MAX_USER_CONNECTIONS count

    限制了一个账户对服务器的并发连接数。一个非零的 count 显式指定此限制,如果为0(默认为0),服务器会根据全局系统变量max_user_connections来决定并发量。如果max_user_connections也为0,那么此账户的并发连接量将无限制。

例如:

CREATE USER 'jeffrey'@'localhost'
WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;

如果限制的是次数,那么最新的一个实例将具有优先权。

Password-Expiration Options

CREATE USER 提供 password_option 选项来管理密码过期,账户密码过期失效或者建立密码过期策略( policy )。 policy 选项不会使得密码过期,它只是决定了服务器何时自动过账户密码(详情参见Section 7.3.6, “Password Expiration Policy”)。

密码的生命周期由最近一次更新的日期时间进行评估。

CREATE USER 允许以下 password_option

  • PASSWORD EXPIRE

    使得账户密码过期:

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
  • PASSWORD EXPIRE DEFAULT

    使用全局系统变量max_user_connections来指定密码过期策略。

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
  • PASSWORD EXPIRE NEVER

    禁止密码过期。

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
  • PASSWORD EXPIRE INTERVAL N DAY

    每过N天密码过期。

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;

如果指定了多个过期策略,将使用最后一次指定的策略。

如果一个账户的密码手动过期或者由于超过了自动过期策略决定的密码生命周期,一个客户端session操作将会进入限制模式。在限制模式中,session中执行操作会得到一个异常的结果,知道建立一个新的账户密码,详情参见:Section 7.3.6, “Password Expiration Policy”

Account-Locking Options

MySQL支持使用 ACCOUNT LOCKACCOUNT UNLOCK 来进行账户锁定和解锁,它们指定了账户的锁状态。详情参见Section 7.3.10, “User Account Locking”

如果指定了多个 account-option ,最后一次指定的将会优先使用。

CREATE USER Before MySQL 5.7.6

下面有空再翻译了没空就算了哈哈哈。

14.7.1.2 MySQL创建用户句法的更多相关文章

  1. Mysql创建用户并授权

    运行命令行 mysql -uroot -p 登录mysql use mysql; 创建用户:create user 'test123'@'localhost' identified by '12345 ...

  2. MySQL创建用户的三种方法 (并授权)转

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  3. MySQL创建用户的三种方法

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  4. mysql创建用户

    mysql创建用户 创建用于localhost连接的用户并指定密码 mysql> create user 'pcom'@'localhost' identified by 'aaa7B2249' ...

  5. MySQL 创建用户 与 授权

    例,需要给 121.52.215.100 连接添加一个用户 dee,密码是 123456,他只能对数据库 vshop 有 select 权限: CREATE USER '; GRANT SELECT ...

  6. mysql 创建用户、设置权限

    MySQL创建用户与授权 一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用 ...

  7. Mysql 创建用户授权

    MySQL创建用户与授权 一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用 ...

  8. mysql创建用户与pymsql模块

    mysql 创建用户及增删改查 创建mysql 用户 with grant option 表示用户不存在自主创建 grant [ select ……,insert ……| all ] on 库名.表名 ...

  9. 14-补充内容:MySQl创建用户和授权

    [转]14-补充内容:MySQl创建用户和授权 权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操 ...

随机推荐

  1. 时光轴三之 ExpandableListView版时光轴效果

    上两篇讲到了用listView和recyclerView来实现时光轴,这一篇我们用ExpandableListView来实现时光轴,废话不多说,直接来代码. 还是先activity_main.xml ...

  2. Fiddler使用总结一(使用Fiddler捕获手机所有http/https通信)

    与后端数据通信是前端日常开发的重要一环,在与后端接口联调的时候往往需要通过查看后端返回的数据进行调试.如果在PC端,Chrome自带的DevTools就已经足够用了,Network面板可以记录所有网络 ...

  3. SSM学习(三)--集成spring mvc

    spirng mvc是一个mvc框架,与struts2类似,都是基于Servlet封装而成的框架,所以要了解spring mvc或者struts2比需先了解Servlet,本篇我们先把spring m ...

  4. 自学Zabbix3.4-资产清单inventory

    当监控的设备越来越多,有时候搞不清楚哪台服务器.网络设备是什么配置,abbix专门设置了设备资产管理功能.我们创建或者编辑主机的时候,可以看到清单(inventory)功能.里面大致包含mac地址.硬 ...

  5. 「mysql优化专题」优化之路高级进阶——表的设计及优化(6)

    正文:表的设计及优化(真技术文) 优化①:创建规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于2 ...

  6. The ResourceConfig instance does not contain any root resource classes

    问题描述 当我们在使用 myeclipse 创建 Web Service Projects 项目后,运行项目然后就会出现这个问题. 解决方案 通过这个错误描述,我们项目没有找到这个资源.报错的原因在于 ...

  7. 【功能代码】---3 JS判断字符串是否包含某个字符串

    JS判断字符串是否包含某个字符串 var str ="abc"; if(str.indexOf("bc")>-1){ alert('str中包含bc字符串 ...

  8. python数字转字符串

    参考文献: tt=322 tem='%d' %tt 可用,已经试用

  9. Node之Express服务器启动安装与配置

    首先安装express-generator cnpm i -g express-generator 使用express --version查看express版本 生成express服务 express ...

  10. 深谈auto变量

    1.c++中有一个关键字auto,c语言也有这么一个关键字,但是两者的意义大不相同. 2.c++中用auto定义的变量自动匹配赋值号右边的值的类型,具有自动匹配类型的作用,而c语言中auto只是声明一 ...