mysql帐号管理相关

帐号管理相关

创建用户声明

CREATE USER [IF NOT EXISTS]
    user [auth_option] [, user [auth_option]] ...
    DEFAULT ROLE role [, role ] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...
    [COMMENT 'comment_string' | ATTRIBUTE 'json_object']

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY 'auth_string' [AND 2fa_auth_option]
  | IDENTIFIED BY RANDOM PASSWORD [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin [initial_auth_option]
}

2fa_auth_option: {
    IDENTIFIED BY 'auth_string' [AND 3fa_auth_option]
  | IDENTIFIED BY RANDOM PASSWORD [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 3fa_auth_option]
}

3fa_auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
}

initial_auth_option: {
    INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'}
  | INITIAL AUTHENTICATION IDENTIFIED WITH auth_plugin AS 'auth_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 [DEFAULT | NEVER | INTERVAL N DAY]
  | PASSWORD HISTORY {DEFAULT | N}
  | PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
  | PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
  | FAILED_LOGIN_ATTEMPTS N
  | PASSWORD_LOCK_TIME {N | UNBOUNDED}
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

首次创建帐户时没有特权,默认角色为 。要分配特权或角色,请使用 GRANT 语句。NONE

例如:创建用户帐号

mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
帐户名的主机名部分(如果省略)默认为 。'%'

示例:创建一个使用默认身份验证插件和给定密码的帐户。将密码标记为已过期,以便用户在首次连接到服务器时必须选择一个新密码:

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

示例:创建一个使用身份验证插件和给定密码的帐户。要求每 180 天选择一个新密码,并启用登录失败跟踪,以便连续三个不正确的密码导致帐户临时锁定两天:caching_sha2_password

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH caching_sha2_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY
  FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;

示例:创建多个帐户,指定一些每个帐户的属性和一些全局属性:

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

删除角色语句

mysql> DROP ROLE [IF EXISTS] *role* [, *role* ] ...
DROP ROLE 'admin', 'developer';
DROP ROLE 'webapp'@'localhost';
角色名的主机名部分(如果省略)默认为 。'%'

删除角色会删除一个或多个角色(命名的权限集合)。要使用此语句,您必须具有全局删除角色或创建用户特权。启用read_only系统变量后,DROP ROLE还需要CONNECTION_ADMIN权限(或已弃用的 SUPER权限)。

删除用户声明

mysql> DROP USER [IF EXISTS] *user* [, *user*] ...
DROP USER 语句删除一个或多个 MySQL 帐户及其权限。它会从所有授权表中删除帐户的权限行。

例如:

DROP USER 'jeffrey'@'localhost';
帐户名的主机名部分(如果省略)默认为 。'%'

授予声明

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]
    [AS user
        [WITH ROLE
            DEFAULT
          | NONE
          | ALL
          | ALL EXCEPT role [, role ] ...
          | role [, role ] ...
        ]
    ]
}

GRANT PROXY ON user_or_role
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]

GRANT role [, role] ...
    TO user_or_role [, user_or_role] ...
    [WITH ADMIN OPTION]

object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

user_or_role: {
    user (see Section 6.2.4, “Specifying Account Names”)
  | role (see Section 6.2.5, “Specifying Role Names”)
}
  • GRANT不能在同一语句中混合授予特权和角色。给定GRANT语句必须授予特权或角色。

  • 该子句区分语句是否授予特权或角色:ON

    • 使用 ,语句将授予特权。ON
    • 如果没有 ,该语句将授予角色。ON
    • 允许将特权和角色都分配给帐户,但必须使用单独的 GRANT 语句,每个语句都具有适合于要授予的内容的语法。

REVOKE语句与 GRANT相关,使管理员能够删除帐户权限。

例如:

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';
帐户或角色名的主机名部分(如果省略)默认为 。'%'

通常,数据库管理员首先使用 CREATE USER 创建帐户并定义其非特权特征,例如密码、是否使用安全连接以及对服务器资源的访问限制,然后使用GRANT定义其权限。ALTER USER可用于更改现有帐户的非特权特征。例如:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;

若要确定此问题是否适用于您,请执行以下查询,其中列出了任何匿名用户:

SELECT Host, User FROM mysql.user WHERE User='';
MySQL 支持的权限

授予和撤销的允许静态权限

特权 含义和可授予级别
ALL [PRIVILEGES] 在指定访问级别授予除授予选项和代理之外的所有权限。
ALTER 启用更改表的使用。级别:全局、数据库、表。
ALTER ROUTINE 允许更改或删除存储的例程。级别:全局、数据库、例程。
CREATE 启用数据库和表创建。级别:全局、数据库、表。
CREATE ROLE 启用角色创建。级别:全局。
CREATE ROUTINE 启用存储例程创建。级别:全局,数据库。
CREATE TABLESPACE 允许创建、更改或删除表空间和日志文件组。级别:全局。
CREATE TEMPORARY TABLES 启用创建临时表的使用。级别:全局,数据库。
CREATE USER 启用创建用户、删除用户`、和撤消所有权限。级别:全局。
CREATE VIEW 允许创建或更改视图。级别:全局、数据库、表。
DELETE 启用删除。级别:全局、数据库、表。
DROP 允许删除数据库、表和视图。级别:全局、数据库、表。
DROP ROLE 启用要删除的角色。级别:全局。
EVENT 为事件计划程序启用事件的使用。级别:全局,数据库。
EXECUTE 使用户能够执行存储的例程。级别:全局、数据库、例程。
FILE 使用户能够使服务器读取或写入文件。级别:全局。
GRANT OPTION 启用向其他帐户授予权限或从其他帐户中删除的权限。级别:全局、数据库、表、例程、代理。
INDEX 允许创建或删除索引。级别:全局、数据库、表。
INSERT 启用插入级别:全局、数据库、表、列。
LOCK TABLES 在您具有 SELECT权限的表上启用 LOCK 表。级别:全局,数据库。
PROCESS 使用户能够使用 SHOW 进程列表查看所有进程.级别:全局。
PROXY 启用用户代理。级别:从用户到用户。
REFERENCES 启用外键创建。级别:全局、数据库、表、列。
RELOAD 启用 FLUSH 操作的使用。级别:全局。
REPLICATION CLIENT 使用户能够询问源服务器或副本服务器的位置。级别:全局。
REPLICATION SLAVE 使副本能够从源中读取二进制日志事件。级别:全局。
SELECT 启用 SELECT 的使用。级别:全局、数据库、表、列。
SHOW DATABASES 启用显示数据库以显示所有数据库。级别:全局。
SHOW VIEW 启用显示创建视图的使用。级别:全局、数据库、表。
SHUTDOWN 启用 mysqladmin shutdown 的使用。级别:全局。
SUPER 允许使用其他管理操作,例如将复制源更改为,将主服务器更改为,终止,清除二进制日志,设置全局和mysqladmin调试命令。级别:全局。
TRIGGER 启用触发器操作。级别:全局、数据库、表。
UPDATE 启用更新的使用。级别:全局、数据库、表、列。
USAGE “无特权”的同义词

授予和撤销的允许动态权限

特权 含义和可授予级别
APPLICATION_PASSWORD_ADMIN 启用双密码管理。级别:全局。
AUDIT_ABORT_EXEMPT 允许审核日志筛选器阻止的查询。级别:全局。
AUDIT_ADMIN 启用审核日志配置。级别:全局。
AUTHENTICATION_POLICY_ADMIN 启用身份验证策略管理。级别:全局。
BACKUP_ADMIN 启用备份管理。级别:全局。
BINLOG_ADMIN 启用二进制日志控制。级别:全局。
BINLOG_ENCRYPTION_ADMIN 启用二进制日志加密的激活和停用。级别:全局。
CLONE_ADMIN 启用克隆管理。级别:全局。
CONNECTION_ADMIN 启用连接限制/限制控制。级别:全局。
ENCRYPTION_KEY_ADMIN 启用密钥轮换。级别:全局。InnoDB
FIREWALL_ADMIN 启用防火墙规则管理,任何用户。级别:全局。
FIREWALL_EXEMPT 免除用户防火墙限制。级别:全局。
FIREWALL_USER 启用防火墙规则管理,自行。级别:全局。
FLUSH_OPTIMIZER_COSTS 启用优化程序成本重新加载。级别:全局。
FLUSH_STATUS 启用状态指示灯刷新。级别:全局。
FLUSH_TABLES 启用表刷新。级别:全局。
FLUSH_USER_RESOURCES 启用用户资源刷新。级别:全局。
GROUP_REPLICATION_ADMIN
INNODB_REDO_LOG_ENABLE 启用或禁用重做日志记录。级别:全局。
INNODB_REDO_LOG_ARCHIVE 启用重做日志存档管理。级别:全局。
NDB_STORED_USER 启用SQL节点(NDB群集)之间的用户或角色共享。级别:全局。
PASSWORDLESS_USER_ADMIN 启用无密码用户帐户管理。级别:全局。
PERSIST_RO_VARIABLES_ADMIN 启用持久化只读系统变量。级别:全局。
REPLICATION_APPLIER 充当复制通道的 。级别:全局。PRIVILEGE_CHECKS_USER
REPLICATION_SLAVE_ADMIN 启用常规复制控制。级别:全局。
RESOURCE_GROUP_ADMIN 启用资源组管理。级别:全局。
RESOURCE_GROUP_USER 启用资源组管理。级别:全局。
ROLE_ADMIN 启用要授予或撤消的角色,请使用 。级别:全局。WITH ADMIN OPTION
SESSION_VARIABLES_ADMIN 启用设置受限会话系统变量。级别:全局。
SET_USER_ID 启用设置非自身值。级别:全局。DEFINER
SHOW_ROUTINE 启用对存储的例程定义的访问。级别:全局。
SYSTEM_USER 将帐户指定为系统帐户。级别:全局。
SYSTEM_VARIABLES_ADMIN 启用修改或保留全局系统变量。级别:全局。
TABLE_ENCRYPTION_ADMIN 启用覆盖默认加密设置。级别:全局。
VERSION_TOKEN_ADMIN 启用版本令牌功能。级别:全局。
XA_RECOVER_ADMIN 启用 XA 恢复执行。级别:全局。

在 GRANT语句中,所有 PRIVILEGE 或 PROXY特权必须单独命名,并且不能与其他特权一起指定ALL PRIVILEGE代表除 GRANT 选项和 PROXY 权限之外,所有可用于授予权限的级别的权限。

例如,此语句全局授予 SELECT INSERT 特权:

GRANT SELECT, INSERT ON *.* TO u1;

则可以通过撤销特定数据库的特权来显式拒绝在全局级别授予的权限:

GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;

全局权限是管理权限或应用于给定服务器上的所有数据库。要分配全局权限,请使用以下语法:ON *.*

GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';
The CREATE TABLESPACE, CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, and SUPER static privileges are administrative and can only be granted globally. all 权限中的权限

MySQL将全局权限存储在系统表中。mysql.user

数据库权限

数据库权限适用于给定数据库中的所有对象。要分配数据库级权限,请使用语法:ON *db_name*.*

GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
表特权

表权限适用于给定表中的所有列。要分配表级权限,请使用语法:ON *db_name.tbl_name*

GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
列权限

列特权适用于给定表中的单列。要在列级别授予的每个权限后面必须跟有一个或多个列,并用括号括起来。

GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
存储的例行权限

ALTER、创建例程、执行和 GRANT 选项特权适用于存储例程(过程和函数)。可以在全局和数据库级别授予它们。除 CREATE 例程外,可以在例程级别为单个例程授予这些特权。

GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
代理用户权限

PROXY特权使一个用户成为另一个用户的代理。代理用户模拟或获取代理用户的身份;也就是说,它假定代理用户的权限。

GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';

授予 PROXY 后,它必须是 GRANT语句中指定的唯一特权,并且唯一允许的选项是 。WITH``WITH GRANT OPTION

代理要求代理用户通过插件进行身份验证,该插件在代理用户连接时将代理用户的名称返回给服务器,并且代理用户具有代理用户的权限。

MySQL将代理权限存储在系统表中。mysql.proxies_priv

授予角色
GRANT`不带子句的语法授予角色而不是个人特权。角色是特权的命名集合;请参见[第 6.2.10 节 “使用角色”。](https://dev.mysql.com/doc/refman/8.0/en/roles.html)例如:`ON
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
查询权限
mysql> SHOW GRANTS FOR u2;
+-------------------------------------------------+
| Grants for u2@%                                 |
+-------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE ON *.* TO `u2`@`%` |
+-------------------------------------------------+

重命名用户声明

RENAME USER old_user TO new_user
    [, old_user TO new_user] ...

RENAME USER语句重命名现有的 MySQL 帐户。不存在的旧帐户或已存在的新帐户会发生错误。

例如:

RENAME USER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';

帐户名的主机名部分(如果省略)默认为 。'%'

撤销语句声明

REVOKE [IF EXISTS]
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] PROXY ON user_or_role
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] role [, role ] ...
    FROM user_or_role [, user_or_role ] ...
    [IGNORE UNKNOWN USER]

user_or_role: {
    user (see Section 6.2.4, “Specifying Account Names”)
  | role (see Section 6.2.5, “Specifying Role Names”
}

REVOKE 语句使系统管理员能够撤消特权和角色,这些特权和角色可以从用户帐户和角色中撤消。

例如:

REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';
REVOKE SELECT ON world.* FROM 'role3';

要撤消所有权限,请使用第二种语法,该语法将删除指定用户或角色的所有全局、数据库、表、列和例程权限:

REVOKE ALL PRIVILEGES, GRANT OPTION
  FROM user_or_role [, user_or_role] ...

设置密码语句

SET PASSWORD [FOR user] auth_option
    [REPLACE 'current_auth_string']
    [RETAIN CURRENT PASSWORD]

auth_option: {
    = 'auth_string'
  | TO RANDOM
}

SET PASSWORD 语句为 MySQL 用户帐户分配密码。密码可以在语句中显式指定,也可以由MySQL随机生成。该语句还可能包括一个密码验证子句(指定要替换的帐户当前密码)和一个子句(用于管理帐户是否具有辅助密码)。 每个都表示一个明文(未加密)密码。'*auth_string*'``'*current_auth_string*'

ALTER USER不是使用 SET PASSWORD 来分配密码,而是帐户更改(包括分配密码)的首选语句。例如:

ALTER USER user IDENTIFIED BY 'auth_string';

设置密码允许以下auth_option语法:

  • = '*auth_string*'

    为帐户分配给定的文本密码。

  • TO RANDOM

    为帐户分配由MySQL随机生成的密码。该语句还在结果集中返回明文密码,以使其可供执行该语句的用户或应用程序使用。

    有关随机生成的密码的结果集和特征的详细信息,请参阅随机密码生成

SET PASSWORD可以与显式命名用户帐户的子句一起使用,也可以不带子句:FOR

  • 使用子句,该语句为命名帐户设置密码,该密码必须存在:FOR *user*

    SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
    
  • 如果没有子句,该语句将为当前用户设置密码:FOR *user*

    SET PASSWORD = 'auth_string';
    

设置角色语句

SET ROLE {
    DEFAULT
  | NONE
  | ALL
  | ALL EXCEPT role [, role ] ...
  | role [, role ] ...
}

SET ROLE通过指定当前用户授予的角色处于活动状态来修改当前用户在当前会话中的有效权限。授予的角色包括显式授予用户的角色和mandatory_roles系统变量值中指定的角色。

例子:

SET ROLE DEFAULT;
SET ROLE 'role1', 'role2';
SET ROLE ALL;
SET ROLE ALL EXCEPT 'role1', 'role2';

指定帐户名称

帐户名显示在 SQL 语句(如创建用户授予和设置密码中,并遵循以下规则:

  • 帐户名语法为 。'user_name'@'host_name'
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容