当前位置: 首页 > news >正文

MySQL之密码策略和用户授权

华子目录

  • 密码策略
    • 查看数据库当前的密码策略
    • 密码策略详解
      • caching_sha2_password_auto_generate_rsa_keys
      • caching_sha2_password_digest_rounds
      • caching_sha2_password_private_key_path
      • caching_sha2_password_public_key_path
      • default_password_lifetime
      • disconnect_on_expired_password
      • generated_random_password_length
      • mysql_native_password_proxy_users
      • password_history
      • password_require_current
      • password_reuse_interval
      • sha256_password_auto_generate_rsa_keys
      • sha256_password_private_key_path
      • sha256_password_proxy_users
      • sha256_password_public_key_path
    • 查看==密码验证插件==
      • validate_password.changed_characters_percentage
      • validate_password.check_user_name
      • validate_password.dictionary_file
      • validate_password.length
      • validate_password.mixed_case_count
      • validate_password.number_count
      • validate_password.policy
      • validate_password.special_char_count
    • 修改密码策略
      • 方法1:临时修改
      • 方法2:永久性修改
      • 方法3:配置文件永久性修改
    • win和Linux下的配置文件
  • 用户授权
    • 创建用户
    • 查看用户
    • 查看用户权限
      • 查看==某个用户==从==哪个服务器ip地址==连接对==某个数据库==的操作权限
      • 查看用户对单个表的权限
    • usage权限
    • 删除用户
    • 授权
      • MySQL常用授权列表
    • 回收权限
  • 临时性修改MySQL中的系统变量
  • 持久性修改MySQL中的系统变量

密码策略

  • MySQL8.0之后会生成临时密码,查看临时密码
[root@sql ~]# awk '/temporary password/ {print $NF}' /var/log/mysqld.log
fk?lyfP&N3im
[root@sql ~]# grep 'password' /var/log/mysqld.log
2024-02-04T14:55:57.394017Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: fk?lyfP&N3im

查看数据库当前的密码策略

mysql> show variables like '%password%';
+-------------------------------------------------+-----------------+
| Variable_name                                   | Value           |
+-------------------------------------------------+-----------------+
| caching_sha2_password_auto_generate_rsa_keys    | ON              |
| caching_sha2_password_digest_rounds             | 5000            |
| caching_sha2_password_private_key_path          | private_key.pem |
| caching_sha2_password_public_key_path           | public_key.pem  |
| default_password_lifetime                       | 0               |
| disconnect_on_expired_password                  | ON              |
| generated_random_password_length                | 20              |
| mysql_native_password_proxy_users               | OFF             |
| password_history                                | 0               |
| password_require_current                        | OFF             |
| password_reuse_interval                         | 0               |
| report_password                                 |                 |
| sha256_password_auto_generate_rsa_keys          | ON              |
| sha256_password_private_key_path                | private_key.pem |
| sha256_password_proxy_users                     | OFF             |
| sha256_password_public_key_path                 | public_key.pem  |
| validate_password.changed_characters_percentage | 0               |
| validate_password.check_user_name               | ON              |
| validate_password.dictionary_file               |                 |
| validate_password.length                        | 8               |
| validate_password.mixed_case_count              | 1               |
| validate_password.number_count                  | 1               |
| validate_password.policy                        | MEDIUM          |
| validate_password.special_char_count            | 1               |
+-------------------------------------------------+-----------------+

密码策略详解

1. `caching_sha2_password_auto_generate_rsa_keys`: 当设置为`ON`时,如果没有可用的RSA密钥对,MySQL服务器将自动生成它们,这对于SHA-2密码认证是必需的。2. `caching_sha2_password_digest_rounds`: 这个值(设置为5000)表示在使用SHA-2密码认证时,密码摘要计算的迭代次数。3. `caching_sha2_password_private_key_path`: 指向存储RSA私钥的文件的路径,这里使用的是`private_key.pem`4. `caching_sha2_password_public_key_path`: 指向存储RSA公钥的文件的路径,这里使用的是`public_key.pem`5. `default_password_lifetime`: 设置为`0`,表示用户密码没有到期限制,用户密码永不过期。6. `disconnect_on_expired_password`: 设置为`ON`,表示如果用户的密码已过期,MySQL将在用户下次尝试连接时断开连接。7. `generated_random_password_length`: 设置为`20`,表示MySQL服务器生成的随机密码的长度。8. `mysql_native_password_proxy_users`: 设置为`OFF`,表示不允许使用`mysql_native_password`插件的代理用户功能。9. `password_history`: 设置为`0`,表示MySQL服务器不会保留密码的历史记录,所以用户可以随时重用旧密码。10. `password_require_current`: 设置为`OFF`,表示在更改密码时不需要提供当前密码。11. `password_reuse_interval`: 设置为`0`,表示没有限制用户多久之后可以重用旧密码。12. `report_password`: 这个参数没有显示值,通常用于控制是否报告密码更改。13. `sha256_password_auto_generate_rsa_keys`: 设置为`ON`,和`caching_sha2_password_auto_generate_rsa_keys`类似,用于自动生成SHA-256密码认证所需的RSA密钥对。14. `sha256_password_private_key_path`:`caching_sha2_password_private_key_path`,指定SHA-256密码认证所用的RSA私钥文件路径。15. `sha256_password_proxy_users`: 设置为`OFF`,表示不允许使用`sha256_password`插件的代理用户功能。16. `sha256_password_public_key_path`:`caching_sha2_password_public_key_path`,指定SHA-256密码认证所用的RSA公钥文件路径。17. `validate_password.changed_characters_percentage`: 设置为`0`,表示没有强制要求密码在更改时与旧密码有多少百分比的字符不同。18. `validate_password.check_user_name`: 设置为`ON`,表示在密码验证过程中,会检查密码是否包含用户名。19. `validate_password.dictionary_file`: 没有具体值,这通常指向一个文件,该文件包含不允许作为密码一部分的单词列表。20. `validate_password.length`: 设置为`8`,表示密码的最小长度要求。21. `validate_password.mixed_case_count`: 设置为`1`,表示密码中至少需要包含一个大写字母和一个小写字母。22. `validate_password.number_count`: 设置为`1`,表示密码中至少需要包含一个数字。23. `validate_password.policy`: 设置为`MEDIUM`,表示密码复杂性策略的等级。24. `validate_password.special_char_count`: 设置为`1`,表示密码中至少需要包含一个特殊字符。这些设置影响着MySQL服务器中用户账户密码的复杂性和安全性要求。根据具体的安全策略需要,数据库管理员可以调整这些参数值。

caching_sha2_password_auto_generate_rsa_keys

`caching_sha2_password_auto_generate_rsa_keys` 是一个 MySQL 系统变量,用于指定在需要时是否自动生成 RSA 密钥对来加密和解密客户端的密码,以及用于签名和验证握手数据。`caching_sha2_password_auto_generate_rsa_keys` 主要用于控制 MySQL 使用的加密算法和密钥管理。当设置为 `ON` 时,MySQL 将会在需要时自动生成 RSA 密钥对。RSA 密钥对用于加密和解密客户端的密码,以及签名和验证握手数据。这是为了提供安全的身份验证和通信,特别是在加密连接上。默认情况下,`caching_sha2_password_auto_generate_rsa_keys` 被设置为 `ON`,这意味着 MySQL 会在需要时自动生成 RSA 密钥对。这样可以确保在安装或重新初始化 MySQL 数据库时,不需要手动创建和配置 RSA 密钥对。你可以使用以下语句来设置 `caching_sha2_password_auto_generate_rsa_keys`:mysql> SET GLOBAL caching_sha2_password_auto_generate_rsa_keys = ON;
或者
mysql> SET GLOBAL caching_sha2_password_auto_generate_rsa_keys = OFF;根据实际需求和安全要求,你可以根据需要启用或禁用自动生成 RSA 密钥对。

caching_sha2_password_digest_rounds

`caching_sha2_password_digest_rounds` 是一个 MySQL 系统变量,用于指定 SHA-256 缓存身份验证插件(caching_sha2_password)中使用的密码哈希迭代轮数。这个变量控制了加密用户密码时使用的哈希函数的计算复杂度。更高的迭代轮数意味着计算哈希值所需的时间更长,因此增加了密码的安全性。具体地说,`caching_sha2_password_digest_rounds` 定义了使用 SHA-256 加密算法加密密码时的哈希迭代轮数。较高的迭代轮数增加了密码哈希的计算复杂度,使得破解密码更加困难。默认情况下,`caching_sha2_password_digest_rounds` 的值为5000。这个值提供了一个合理的安全性水平,但可以根据实际需求和安全要求进行调整。你可以使用以下语句来设置 `caching_sha2_password_digest_rounds`:mysql> SET GLOBAL caching_sha2_password_digest_rounds = 10000;这将增加密码哈希的计算复杂度,提高密码的安全性。根据安全需求和性能要求,你可以根据需要调整密码哈希迭代轮数。

caching_sha2_password_private_key_path

`caching_sha2_password_private_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件时,存储私钥的文件路径。SHA-256 缓存身份验证插件(caching_sha2_password)是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。私钥是在加密和解密过程中用于生成和验证加密签名的重要部分。当 MySQL 使用 SHA-256 缓存身份验证插件时,`caching_sha2_password_private_key_path` 变量指定了存储用于加密的私钥的文件路径。通常情况下,私钥文件的扩展名为 `.pem`。默认情况下,`caching_sha2_password_private_key_path` 设置为 `private_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `private_key.pem` 的私钥文件。如果需要更改私钥文件的路径,可以通过修改此系统变量来指定新的路径。请注意,私钥文件的安全性非常重要,因此应该妥善保护私钥文件,只有授权的用户可以访问。任何泄露私钥文件的情况都可能导致安全漏洞和数据泄露风险。

caching_sha2_password_public_key_path

`caching_sha2_password_public_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件时,存储公钥的文件路径。SHA-256 缓存身份验证插件(caching_sha2_password)是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。公钥是用于验证从客户端发送的加密数据的重要部分。当 MySQL 使用 SHA-256 缓存身份验证插件时,`caching_sha2_password_public_key_path` 变量指定了存储用于加密的公钥的文件路径。通常情况下,公钥文件的扩展名为 `.pem`。默认情况下,`caching_sha2_password_public_key_path` 设置为 `public_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `public_key.pem` 的公钥文件。如果需要更改公钥文件的路径,可以通过修改此系统变量来指定新的路径。请注意,公钥文件的安全性非常重要,因此应该妥善保护公钥文件,只有授权的用户可以访问。任何泄露公钥文件的情况都可能导致安全漏洞和数据泄露风险。

default_password_lifetime

`default_password_lifetime` 是一个 MySQL 系统变量,用于指定新创建用户的密码的默认过期时间。当这个系统变量被设置为一个非零值时,新创建的用户的密码将在指定的时间段后过期。过期后,用户将被要求更改密码,否则将无法登录 MySQL。如果 `default_password_lifetime` 被设置为0,意味着新创建用户的密码将永不过期,即密码不会被强制更改。默认情况下,`default_password_lifetime` 通常被设置为0,这意味着新用户的密码不会被强制更改。但是,根据安全策略和合规性要求,你可以将其设置为一个正整数值,以强制密码定期更改。例如,如果要求所有用户的密码每90天更改一次,可以执行以下语句:
mysql> set global default_password_lifetime = 90;这将使新创建的用户的密码在创建后90天后过期,需要用户更改密码才能继续使用 MySQL。

disconnect_on_expired_password

`disconnect_on_expired_password` 是一个 MySQL 系统变量,用于指定当用户的密码过期时是否断开与 MySQL 的连接。当 `disconnect_on_expired_password` 被设置为 `ON` 时,如果用户的密码过期了,MySQL 将会立即断开与该用户的连接。这意味着用户需要重新连接并提供一个新的、未过期的密码才能再次访问数据库。默认情况下,`disconnect_on_expired_password` 被设置为 `ON`,这意味着当密码过期时,MySQL 将会断开与用户的连接。这是为了确保安全性,因为过期的密码可能不再安全,需要用户立即更改。如果将 `disconnect_on_expired_password` 设置为 `OFF`,则即使密码过期,MySQL 也不会立即断开与用户的连接。这可能会导致安全风险,因为用户可以继续使用过期的密码来访问数据库。你可以使用以下语句来设置 `disconnect_on_expired_password`:
mysql> SET GLOBAL disconnect_on_expired_password = ON;
或者
mysql> SET GLOBAL disconnect_on_expired_password = OFF;根据安全策略和合规性要求,你可以根据实际情况选择是否启用这个选项。

generated_random_password_length

`generated_random_password_length` 是一个 MySQL 系统变量,用于指定自动生成的随机密码的长度。当 MySQL 需要生成随机密码时,例如在创建新用户或重置密码时,会使用此变量指定的长度生成随机密码。默认情况下,`generated_random_password_length` 的值为 20,这意味着自动生成的随机密码将包含 20 个字符。这个长度可以根据实际需求进行调整。例如,如果你想将自动生成的随机密码的长度设置为 12,可以执行以下语句:mysql> SET GLOBAL generated_random_password_length = 12;这将使 MySQL 自动生成的随机密码长度为 12 个字符。根据安全需求和实际情况,你可以根据需要调整密码长度。

mysql_native_password_proxy_users

`mysql_native_password_proxy_users` 是一个 MySQL 系统变量,用于控制是否启用原生密码代理用户。MySQL 原生密码代理用户是一种特殊类型的用户,其密码存储在 `mysql.user` 表中,采用了旧版的密码散列算法,例如 MySQL 5.7 之前使用的加密方式。当 MySQL 8.0 以后的版本与旧版 MySQL(例如 5.7 或更早版本)进行连接时,可能需要使用原生密码代理用户,以便这些旧版本的客户端能够成功连接到 MySQL 8.0 以上的服务器。如果将 `mysql_native_password_proxy_users` 设置为 `ON`,则 MySQL 服务器将允许原生密码代理用户连接,并且对于使用旧版密码散列算法的用户,将尝试使用原生密码进行身份验证。如果设置为 `OFF`,则禁用原生密码代理用户。默认情况下,`mysql_native_password_proxy_users` 被设置为 `OFF`,这意味着原生密码代理用户被禁用。通常情况下,只有在需要与旧版本的 MySQL 进行兼容时才会启用此选项。你可以使用以下语句来设置 `mysql_native_password_proxy_users`:mysql> SET GLOBAL mysql_native_password_proxy_users = ON;
或者
mysql> SET GLOBAL mysql_native_password_proxy_users = OFF;根据实际需求和环境设置是否启用原生密码代理用户。

password_history

`password_history` 是一个 MySQL 系统变量,用于指定记录用户密码历史的最大长度。具体来说,它定义了在创建或更改用户密码时,系统会保留的先前密码数量。当用户尝试更改其密码时,MySQL 将检查新密码是否与密码历史中的任何旧密码相同。如果设置了 `password_history`,并且新密码与密码历史中的任何一个密码匹配,则新密码将被拒绝。这有助于防止用户反复使用相同的密码,增加了密码的安全性。默认情况下,`password_history` 的值为0,这意味着 MySQL 不会记录用户密码的历史。因此,用户可以在任何时候更改其密码,而不受以前使用过的密码的限制。你可以使用以下语句来设置 `password_history`:mysql> SET GLOBAL password_history = 10;这将使系统记录用户密码历史的最大长度为10,意味着用户不能在最近使用的10个密码中重复使用任何一个。根据安全要求,你可以根据需要调整密码历史记录的长度。

password_require_current

`password_require_current` 是一个 MySQL 系统变量,用于指定用户更改密码时是否需要提供当前密码。当 `password_require_current` 被设置为 `ON` 时,用户在更改密码时必须首先提供当前密码。这样可以确保用户有权限更改密码,并且防止未经授权的人员在没有当前密码的情况下更改密码。默认情况下,`password_require_current` 被设置为 `OFF`,这意味着用户在更改密码时不需要提供当前密码。这使得用户更改密码更加方便,但也可能增加了安全风险,因为任何知道用户名的人都可以尝试更改密码。你可以使用以下语句来设置 `password_require_current`:mysql> SET GLOBAL password_require_current = ON;
或者
mysql> SET GLOBAL password_require_current = OFF;根据安全策略和合规性要求,你可以选择是否要求用户在更改密码时提供当前密码。

password_reuse_interval

`password_reuse_interval` 是一个 MySQL 系统变量,用于指定在更改密码后,用户必须等待多长时间才能重新使用先前使用过的密码。具体来说,`password_reuse_interval` 定义了在更改密码后,系统将拒绝使用在指定间隔内曾经使用过的密码。如果用户试图在此间隔内再次使用先前使用过的密码,则系统将拒绝此操作。这有助于提高密码的安全性,因为强制用户定期更改密码,并且不允许他们在短时间内重复使用先前使用过的密码。默认情况下,`password_reuse_interval` 的值为0,这意味着系统不会限制用户重新使用先前使用过的密码。你可以将其设置为一个正整数值,以定义密码重用的间隔。例如,如果你想要求用户更改密码后至少等待30天才能重新使用先前使用过的密码,可以执行以下语句:mysql> SET GLOBAL password_reuse_interval = 30;根据安全需求和实际情况,你可以根据需要调整密码重用的间隔。

sha256_password_auto_generate_rsa_keys

`sha256_password_auto_generate_rsa_keys` 是一个 MySQL 系统变量,用于指定是否在需要时自动生成 RSA 密钥对来加密和解密客户端的密码,以及用于签名和验证握手数据。当 `sha256_password_auto_generate_rsa_keys` 被设置为 `ON` 时,MySQL 将会在需要使用 SHA-256 缓存身份验证插件(sha256_password)时自动生成 RSA 密钥对。SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。RSA 密钥对是用于加密和解密用户密码以及签名和验证握手数据的关键部分。默认情况下,`sha256_password_auto_generate_rsa_keys` 被设置为 `ON`,这意味着 MySQL 会在需要时自动生成 RSA 密钥对。这样可以确保在安装或重新初始化 MySQL 数据库时,不需要手动创建和配置 RSA 密钥对。你可以使用以下语句来设置 `sha256_password_auto_generate_rsa_keys`:mysql> SET GLOBAL sha256_password_auto_generate_rsa_keys = ON;
或者
mysql> SET GLOBAL sha256_password_auto_generate_rsa_keys = OFF;根据实际需求和安全要求,你可以根据需要启用或禁用自动生成 RSA 密钥对。

sha256_password_private_key_path

`sha256_password_private_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件(sha256_password)时,存储私钥的文件路径。SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。私钥是在加密和解密过程中用于生成和验证加密签名的重要部分。当 MySQL 使用 SHA-256 缓存身份验证插件时,`sha256_password_private_key_path` 变量指定了存储用于加密的私钥的文件路径。通常情况下,私钥文件的扩展名为 `.pem`。默认情况下,`sha256_password_private_key_path` 设置为 `private_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `private_key.pem` 的私钥文件。如果需要更改私钥文件的路径,可以通过修改此系统变量来指定新的路径。请注意,私钥文件的安全性非常重要,因此应该妥善保护私钥文件,只有授权的用户可以访问。任何泄露私钥文件的情况都可能导致安全漏洞和数据泄露风险。

sha256_password_proxy_users

`sha256_password_proxy_users` 是一个 MySQL 系统变量,用于控制是否启用 SHA-256 缓存身份验证插件(sha256_password)的代理用户功能。SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。代理用户功能允许 MySQL 8.0 以上版本的服务器以原生密码(mysql_native_password)方式允许与旧版本 MySQL(例如 5.7 或更早版本)的客户端连接。当 `sha256_password_proxy_users` 被设置为 `ON` 时,MySQL 服务器将允许使用 SHA-256 缓存身份验证插件的代理用户连接,并且对于使用原生密码散列算法的用户,将尝试使用 SHA-256 缓存身份验证插件进行身份验证。如果设置为 `OFF`,则禁用 SHA-256 缓存身份验证插件的代理用户功能。默认情况下,`sha256_password_proxy_users` 被设置为 `OFF`,这意味着代理用户功能被禁用。通常情况下,只有在需要与旧版本的 MySQL 进行兼容时才会启用此选项。你可以使用以下语句来设置 `sha256_password_proxy_users`:mysql> SET GLOBAL sha256_password_proxy_users = ON;
或者
mysql> SET GLOBAL sha256_password_proxy_users = OFF;根据实际需求和环境设置是否启用 SHA-256 缓存身份验证插件的代理用户功能。

sha256_password_public_key_path

`sha256_password_public_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件(sha256_password)时,存储公钥的文件路径。SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。公钥是用于验证从客户端发送的加密数据的重要部分。当 MySQL 使用 SHA-256 缓存身份验证插件时,`sha256_password_public_key_path` 变量指定了存储用于加密的公钥的文件路径。通常情况下,公钥文件的扩展名为 `.pem`。默认情况下,`sha256_password_public_key_path` 设置为 `public_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `public_key.pem` 的公钥文件。如果需要更改公钥文件的路径,可以通过修改此系统变量来指定新的路径。请注意,公钥文件的安全性非常重要,因此应该妥善保护公钥文件,只有授权的用户可以访问。任何泄露公钥文件的情况都可能导致安全漏洞和数据泄露风险。

查看密码验证插件

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

MySQL数据库管理系统中的密码验证插件validate_password)的参数配置。每个参数都用于设置密码策略的不同方面,以确保用户设置的密码符合安全标准。以下是每个参数的含义:

1. `validate_password.changed_characters_percentage`: 当用户更改密码时,新密码与旧密码必须至少有百分之多少的字符不同。这里设置为 `0`,表示没有强制更改字符的比例要求。2. `validate_password.check_user_name`: 当此项设置为 `ON` 时,密码验证过程将检查密码是否包含用户名。如果包含,密码将不被接受。3. `validate_password.dictionary_file`: 此参数指向一个包含不允许作为密码一部分的词汇的文件。在这里没有提供具体的文件路径,所以可能是使用默认的字典文件或者没有指定。4. `validate_password.length`: 这定义了密码的最小长度。在此配置中,最小长度为 `8` 个字符。5. `validate_password.mixed_case_count`: 密码必须包含的最小大小写字母数量。这里的值是 `1`,意味着密码至少需要包含一个小写字母和一个大写字母。6. `validate_password.number_count`: 密码中必须包含的数字的最小数量。设置为 `1`,表示密码至少需要包含一个数字。7. `validate_password.policy`: 定义了密码强度策略的级别。`MEDIUM` 表示采用中等强度的密码策略。8. `validate_password.special_char_count`: 密码必须包含的特殊字符的最小数量。这里设置为 `1`,表示密码至少需要包含一个特殊字符。这些配置帮助数据库管理员强制执行强密码策略,以减少安全风险。

validate_password.changed_characters_percentage

在MySQL中,`validate_password.changed_characters_percentage` 配置参数用于指定在用户更改密码时,新密码中必须有多少百分比的字符与旧密码不同。这是一个确保用户在更改密码时不仅仅是进行微小修改的安全措施。这个参数的值设置为一个0100之间的整数,代表必须更改的字符的最小百分比。比如,如果这个值设置为 `50`,那么新密码至少需要有一半的字符不同于旧密码。如果设置为 `100`,则意味着新密码中的所有字符都不能与旧密码相同。在您提供的图片中,`validate_password.changed_characters_percentage` 的值被设置为 `0`,这意味着没有强制用户在更改密码时更改特定比例的字符。也就是说,用户可以进行轻微的更改,甚至可以重新使用旧密码,这在安全性较低的环境中可能是可接受的,但在需要高安全性的环境中则不建议使用。mysql> SET GLOBAL validate_password.changed_characters_percentage = 50;

validate_password.check_user_name

在MySQL中,`validate_password.check_user_name` 参数用于控制密码验证插件是否应检查密码中是否包含了用户名。当这个参数设置为 `ON`,密码验证过程将确保用户的密码不包含其用户名的任何部分。这是一个安全特性,因为包含用户名的密码通常更容易被猜测。如果用户尝试设置一个包含其用户名的密码,而该参数被激活(即设为 `ON`),密码将被拒绝。这样做可以减少某些基于字典的攻击,其中攻击者可能会尝试使用与用户账户名相关的词汇来破解密码。如果将 `validate_password.check_user_name` 设置为 `OFF`,则禁用此检查,MySQL 将不再验证密码中是否包含用户名。在您提供的图片中,这个参数被设置为 `ON`,这意味着密码验证时将会检查密码中是否包含了用户名,从而提高安全性。mysql> SET GLOBAL validate_password.check_user_name = ON;
mysql> SET GLOBAL validate_password.check_user_name = OFF;

validate_password.dictionary_file

在MySQL中,`validate_password.dictionary_file` 参数用于指定一个文件路径,该文件包含不允许作为密码一部分的词汇列表。这个功能旨在防止用户选择过于简单或者常见的单词作为密码,从而增加密码的安全性。如果指定了 `validate_password.dictionary_file` 参数,并且用户尝试设置一个包含在该文件中的词汇的密码,那么这个密码将被视为不合规,并且设置密码操作将被拒绝。在您提供的图片中,并没有显示具体的文件路径,这可能意味着要么没有指定自定义的字典文件路径,要么使用了默认的字典文件路径。如果需要使用自定义的字典文件,应该在参数中提供该文件的路径。mysql> SET GLOBAL validate_password.dictionary_file = '/path/to/dictionary_file.txt';

validate_password.length

在MySQL中,`validate_password.length` 是一个密码验证插件的参数,它用于定义密码的最小长度要求。当用户设置密码时,系统会检查密码的长度是否满足这个要求。如果密码长度不符合指定的最小长度,则密码设置操作将被拒绝。在您提供的图片中,`validate_password.length` 的值被设置为 `8`,这意味着任何密码至少需要包含8个字符才能符合密码策略要求。这样的设置有助于增强密码的安全性,因为较长的密码通常更难被猜测或暴力破解。mysql> SET GLOBAL validate_password.length = 10;

validate_password.mixed_case_count

在MySQL中,`validate_password.mixed_case_count` 是一个密码验证插件的参数,用于指定密码中必须包含的最小混合大小写字母的数量。换句话说,这个参数规定了密码中至少需要包含多少个大写字母和多少个小写字母,才能符合密码策略要求。例如,如果 `validate_password.mixed_case_count` 被设置为 `1`,那么密码至少需要包含一个大写字母和一个小写字母,否则密码设置操作将被拒绝。在您提供的图片中,`validate_password.mixed_case_count` 的值被设置为 `1`,这意味着密码必须至少包含一个大写字母和一个小写字母才能满足密码策略要求。这种设置有助于增强密码的复杂性,使其更难被猜测或暴力破解。mysql> SET GLOBAL validate_password.mixed_case_count = 2;

validate_password.number_count

在MySQL中,`validate_password.number_count` 是一个密码验证插件的参数,它用于指定密码中必须包含的最小数字数量。换句话说,这个参数规定了密码中至少需要包含多少个数字字符,才能符合密码策略要求。例如,如果 `validate_password.number_count` 被设置为 `1`,那么密码至少需要包含一个数字字符,否则密码设置操作将被拒绝。在您提供的图片中,`validate_password.number_count` 的值被设置为 `1`,这意味着密码必须至少包含一个数字字符才能满足密码策略要求。这种设置有助于增强密码的复杂性,使其更难被猜测或暴力破解。mysql> SET GLOBAL validate_password.number_count = 2;

validate_password.policy

`validate_password.policy` 在 MySQL 中是一个配置参数,它用于定义密码验证插件的策略级别。这个参数确定了密码必须达到的强度,并且可以根据设置的级别,对密码的复杂性进行不同程度的要求。MySQL 中通常有以下几种策略级别:- `LOW`: 密码至少需要达到 `validate_password.length` 参数指定的长度。(low)
- `MEDIUM`: 密码必须满足 `LOW` 策略的要求,同时包含数字、大小写字母和特殊字符。(medium)
- `STRONG`: 密码必须满足 `MEDIUM` 策略的要求,并且不能包含词典文件中的单词。(strong)在您的图片中,`validate_password.policy` 被设置为 `MEDIUM`,这意味着密码至少需要包含一个数字、一个大小写字母和一个特殊字符,并且达到指定的最小长度。这种设置旨在提供比最低要求更强的密码安全性。mysql> SET GLOBAL validate_password.policy = 'STRONG';

validate_password.special_char_count

在MySQL中,`validate_password.special_char_count` 是一个密码验证插件的参数,它用于指定密码中必须包含的最小特殊字符数量。换句话说,这个参数规定了密码中至少需要包含多少个特殊字符,才能符合密码策略要求。例如,如果 `validate_password.special_char_count` 被设置为 `1`,那么密码至少需要包含一个特殊字符,否则密码设置操作将被拒绝。在您提供的图片中,`validate_password.special_char_count` 的值被设置为 `1`,这意味着密码必须至少包含一个特殊字符才能满足密码策略要求。这种设置有助于增强密码的复杂性,使其更难被猜测或暴力破解。mysql> SET GLOBAL validate_password.special_char_count = 2;

修改密码策略

方法1:临时修改

  • 在 MySQL 中,使用 set global 命令修改系统变量会将其值修改为临时值,这意味着修改只在当前 MySQL 会话(多个会话,不仅仅是一个)中有效,并且在 MySQL 服务器重新启动后将被重置为默认值或先前的持久化值。但改完后修改成功的密码后期是可以使用的。
    语法
mysql> set global 变量名=策略值;
mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+mysql> set global validate_password.length=5;mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 5      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

当重启服务器后,又会变回之前的默认值

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

方法2:永久性修改

  • 在 MySQL 中,使用 set persist 命令可以永久性地修改系统变量的值包括密码策略。这意味着修改后的值会在 MySQL 服务器重新启动后保持不变

语法

mysql> set persist 变量名=策略值;
mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+
8 rows in set (0.01 sec)mysql> set persist validate_password.length=5;
Query OK, 0 rows affected (0.00 sec)mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 5      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

重启服务器后,密码策略被永久性修改

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 5      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

方法3:配置文件永久性修改

/etc/my.cnf配置文件中添加:
[mysqld]
validate_password.policy=low
[root@sql ~]# vim /etc/my.cnf
[mysqld]
validate_password.policy=low[root@sql ~]# systemctl restart mysqld
[root@sql ~]# mysql -uroot -pMysql@123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.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 variables like '%validate_password%';
+-------------------------------------------------+-------+
| Variable_name                                   | Value |
+-------------------------------------------------+-------+
| validate_password.changed_characters_percentage | 0     |
| validate_password.check_user_name               | ON    |
| validate_password.dictionary_file               |       |
| validate_password.length                        | 8     |
| validate_password.mixed_case_count              | 1     |
| validate_password.number_count                  | 1     |
| validate_password.policy                        | LOW   |
| validate_password.special_char_count            | 1     |
+-------------------------------------------------+-------+

重启服务器后,密码策略被永久性修改

mysql> show variables like '%validate_password%';
+-------------------------------------------------+-------+
| Variable_name                                   | Value |
+-------------------------------------------------+-------+
| validate_password.changed_characters_percentage | 0     |
| validate_password.check_user_name               | ON    |
| validate_password.dictionary_file               |       |
| validate_password.length                        | 8     |
| validate_password.mixed_case_count              | 1     |
| validate_password.number_count                  | 1     |
| validate_password.policy                        | LOW   |
| validate_password.special_char_count            | 1     |
+-------------------------------------------------+-------+

注:在永久性修改时,系统会优先选择通过set persist命令修改的系统变量

win和Linux下的配置文件

  • win下是my.ini
  • linux下是my.cnf

用户授权

  • MySQL8以后有新的安全要求,不能像之前的版本那样一次性创建用户并授权。需要先创建用户,再进行授权操作。

创建用户

语法

mysql> create user 'username'@'host' identified by 'password';
username:自定义的用户名
host:是允许用户连接的主机,可以是客户端的域名或IP,如果host为'%'时,表示任意IP
password:密码
mysql> create user 'redhat'@'%' identified by 'MYsql@123';
Query OK, 0 rows affected (0.05 sec)

刚创建一个用户后,用户只有usageshow databases的权限,且show databases后的结果只有两个库,分别是:information_schemaperformance_schema

[root@sql ~]# mysql -uredhat -pMYsql@123mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+

查看用户

MySQL中的用户信息存储在mysql库中的user表里

mysql> select user 用户,host 允许主机 from mysql.user;
+------------------+-----------+
| 用户             | 允许主机  |
+------------------+-----------+
| redhat           | %         |
| text             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

查看用户权限

语法

mysql> show grants;   # 查看当前用户权限
或
mysql> show grants for 用户名;
或
mysql> show grants for 用户名@'host';
mysql> show grants for redhat;
+------------------------------------+
| Grants for redhat@%                |
+------------------------------------+
| GRANT USAGE ON *.* TO `redhat`@`%` |
+------------------------------------+
# 这里显示usage权限,表示仅仅可以登录MySQL,有登录权限

查看某个用户哪个服务器ip地址连接对某个数据库的操作权限

  • 这三个字段的组合构成了db表的主键。
mysql> select * from mysql.db;
+-----------+--------------------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+------------------+----------------+---------------------+--------------------+--------------+------------+--------------+
| Host      | Db                 | User          | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Create_tmp_table_priv | Lock_tables_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Execute_priv | Event_priv | Trigger_priv |
+-----------+--------------------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+------------------+----------------+---------------------+--------------------+--------------+------------+--------------+
| %         | huazi              | redhat        | Y           | Y           | Y           | Y           | N           | N         | N          | N               | N          | N          | N                     | N                | N                | N              | N                   | N                  | N            | N          | N            |
| localhost | performance_schema | mysql.session | Y           | N           | N           | N           | N           | N         | N          | N               | N          | N          | N                     | N                | N                | N              | N                   | N                  | N            | N          | N            |
| localhost | sys                | mysql.sys     | N           | N           | N           | N           | N           | N         | N          | N               | N          | N          | N                     | N                | N                | N              | N                   | N                  | N            | N          | Y            |
+-----------+--------------------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+------------------+----------------+---------------------+--------------------+--------------+------------+--------------+

查看用户对单个表的权限

mysql> select * from mysql.tables_priv;
+-----------+-------+---------------+------------+----------------+---------------------+------------+-------------+
| Host      | Db    | User          | Table_name | Grantor        | Timestamp           | Table_priv | Column_priv |
+-----------+-------+---------------+------------+----------------+---------------------+------------+-------------+
| localhost | mysql | mysql.session | user       | boot@          | 2024-02-04 22:55:58 | Select     |             |
| localhost | sys   | mysql.sys     | sys_config | root@localhost | 2024-02-04 22:55:58 | Select     |             |
+-----------+-------+---------------+------------+----------------+---------------------+------------+-------------+

usage权限

  • usage:连接(登录)权限,建立一个用户,就会自动授予usage权限(默认授予)。该usage权限并不能被revoke(回收)。

删除用户

语法

mysql> drop user 用户名;
或
mysql> drop user 用户名@'host';
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| redhat           | %         |
| text             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+mysql> drop user text;
Query OK, 0 rows affected (0.03 sec)mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| redhat           | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

授权

授权原则

  • 只授予能满足需要的最小权限 ,防止用户干坏事。比如用户只是需要查询,那就只给 select 权限就可以了,不要给用户赋予update 、 insert 或者 delete 权限
  • 创建用户的时候限制用户的登录主机 ,一般是限制成指定 IP 或者内网 IP 段。
  • 每个用户设置满足密码复杂度的密码
  • 定期清理不需要的用户 ,回收权限或者删除用户。

语法

mysql> grant 授权列表 on 库名.表名 to 'username' [with option参数];
或
mysql> grant 授权列表 on 库名.表名 to 'username'@'host‘ [with option参数];
mysql> grant insert,delete,update,select on huazi.* to redhat;# 授予redhat用户对huazi库下的所有表增删改查的操作
Query OK, 0 rows affected (0.00 sec)mysql> show grants for redhat;
+-------------------------------------------------------------------+
| Grants for redhat@%                                               |
+-------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `redhat`@`%`                                |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `huazi`.* TO `redhat`@`%` |
+-------------------------------------------------------------------+
#这时就有对huazi库下所有表的insert,delete,update,select权限
#和登录MySQL数据库的usage权限
mysql> create user xiaoming@'%' identified by 'MYSql@123';
Query OK, 0 rows affected (0.01 sec)mysql> show grants for xiaoming;
+--------------------------------------+
| Grants for xiaoming@%                |
+--------------------------------------+
| GRANT USAGE ON *.* TO `xiaoming`@`%` |
+--------------------------------------+mysql> grant create,alter,drop on *.* to xiaoming; #授予xiaoming用户对所有库下的所有表的create,alter,drop权限
Query OK, 0 rows affected (0.00 sec)mysql> show grants for xiaoming;
+----------------------------------------------------+
| Grants for xiaoming@%                              |
+----------------------------------------------------+
| GRANT CREATE, DROP, ALTER ON *.* TO `xiaoming`@`%` |
+----------------------------------------------------+

MySQL常用授权列表

权限列表说明
all 或者all privileges授予用户所有权限
create授予用户创建新数据库和表的权限
drop授予用户删除数据库和表的权限
delete授予用户删除表中的行的权限
alter授予用户修改表结构的权限
insert授予用户在表中插入行(add)的权限
select授予用户运行select命令以从表中读取数据的权限
update授予用户更新表中的数据的权限

回收权限

语法

mysql> revoke 授权列表 on 库名.表名 from 用户;
mysql> show grants for xiaoming;
+----------------------------------------------------+
| Grants for xiaoming@%                              |
+----------------------------------------------------+
| GRANT CREATE, DROP, ALTER ON *.* TO `xiaoming`@`%` |
+----------------------------------------------------+mysql> revoke drop,alter on *.* from xiaoming;
Query OK, 0 rows affected (0.00 sec)mysql> show grants for xiaoming;
+---------------------------------------+
| Grants for xiaoming@%                 |
+---------------------------------------+
| GRANT CREATE ON *.* TO `xiaoming`@`%` |
+---------------------------------------+mysql> flush privileges; #操作完后重新刷新权限
Query OK, 0 rows affected (0.01 sec)mysql> show grants for xiaoming;
+---------------------------------------+
| Grants for xiaoming@%                 |
+---------------------------------------+
| GRANT CREATE ON *.* TO `xiaoming`@`%` |
+---------------------------------------+

临时性修改MySQL中的系统变量

在 MySQL 中,你可以使用 `set global` 命令来临时性地修改系统变量的值。这种修改只在当前的 MySQL 会话中有效,一旦会话结束或 MySQL 服务器重新启动,修改的值就会被重置为默认值或者之前的持久化值。以下是如何使用 `set global` 命令来临时性修改系统变量的示例:mysql> set global validate_password.length = 10;
mysql> set global validate_password.mixed_case_count = 2;
mysql> set global validate_password.number_count = 2;
mysql> set global validate_password.special_char_count = 2;
mysql> set global validate_password.policy = 'STRONG';这将会将修改的密码策略设置为临时性,只在当前的 MySQL 会话中有效。 请注意,使用 `set global` 命令修改系统变量的值需要确保你有足够的权限。

持久性修改MySQL中的系统变量

要在 MySQL 中持久性地修改系统变量,你可以使用 `set persist` 命令。这将确保系统变量的修改在 MySQL 服务器重新启动后仍然保持。以下是如何使用 `set persist` 命令进行持久性修改系统变量的示例:mysql> set persist validate_password.length = 10;
mysql> set persist validate_password.mixed_case_count = 2;
mysql> set persist validate_password.number_count = 2;
mysql> set persist validate_password.special_char_count = 2;
mysql> set persist validate_password.policy = 'STRONG';这将会将修改的密码策略设置为持久化,即使 MySQL 服务器重新启动,修改后的密码策略仍然会保持。请注意,在使用 `SET PERSIST` 命令时,需要确保你对配置文件有适当的写入权限,并且在执行 `set persist` 命令后,需要重新加载 MySQL 配置才能使修改生效。

相关文章:

MySQL之密码策略和用户授权

华子目录 密码策略查看数据库当前的密码策略密码策略详解caching_sha2_password_auto_generate_rsa_keyscaching_sha2_password_digest_roundscaching_sha2_password_private_key_pathcaching_sha2_password_public_key_pathdefault_password_lifetimedisconnect_on_expired_pa…...

电脑通电自启动设置

首先要进入BIOS,以华硕为例,按下电源键,在开机之前按下delete键,其他电脑可能是esc或者某个f键,请自行查找。 进入BIOS后要找到电源管理,可以在高级选项中找一找,如上图右下角选择高级模式。 …...

hive表加字段

目录 1.给表添加字段2.为什么使用cascade3.使用场景 1.给表添加字段 alter table database.tablename add columns(字段名 字段类型 comment 字段中文含义) cascade;2.为什么使用cascade 在Hive中,当你想要修改表结构,例如添加字段时,可能会…...

从零构建Hugo主题 - I

这是一个系列博客,记录了我从零开始构建Hugo主题https://github.com/tomowang/hugo-theme-tailwind的过程。全系列包括四篇文章,这是第一篇: I. 主要介绍我构建Hugo主题的背景,我对主题的功能想法,以及开发环境的搭建…...

【HarmonyOS应用开发】HTTP数据请求(十四)

文章末尾含相关内容源代码 一、概述 日常生活中我们使用应用程序看新闻、发送消息等,都需要连接到互联网,从服务端获取数据。例如,新闻应用可以从新闻服务器中获取最新的热点新闻,从而给用户打造更加丰富、更加实用的体验。 那么…...

MongoDB聚合: $sortByCount

$sortByCount聚合根据指定表达式的值对输入文档进行分组,然后计算每个不同分组中的文档数。 每个输出文档包含两个字段:一个是包含不同分组值的_id字段,另一个是包含属于该分组或类别的文档数量的计数字段。 文档按计数降序排序。 语法 {…...

FY-SA-20237·8-AI‘sIQ

Translated from the Scientific American, July/August 2023 issue. AI’s IQ ChatGPT aced a test but showed that intelligence cannot be measure by IQ alone. —— By Eka Roivainen 翻译:ChatGPT在一项测试中取得了优异的成绩,但也表明智力不能…...

react将选中文本自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…...

Rust语言入门小结(第1篇)

Rust是一种新兴编程语言,既有高级语言的风格,又有底层语言级别的性能;是对于实时性、安全性要求高的应用开发的理想语言。 笔者的自学记录,供参考 环境搭建与第一个Rust程序 以Linux环境为例 # 下载并安装 curl --proto https -…...

前端实现支付跳转以及回跳

// 支付地址 const baseURL http://pcapi-xiaotuxian-front-devtest.itheima.net/ const backURL http://127.0.0.1:5173/paycallback const redirectUrl encodeURIComponent(backURL) const payUrl ${baseURL}pay/aliPay?orderId${route.query.id}&redirect${redirec…...

黑豹程序员-封装组件-Vue3 setup方式子组件传值给父组件

需求 封装组件 需要使用到Vue3中如何定义父子组件&#xff0c;由子组件给父组件传值 核心代码 如何使用emits 组件 <template><button click"sendData">点击按钮</button> </template><script setup> import {ref, defineEmits}…...

PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle、Spark执行流程

目录 RDD持久化 RDD 的数据是过程数据 RDD 缓存 RDD CheckPoint 共享变量 广播变量 累加器 Spark 内核调度 DAG DAG 的宽窄依赖和阶段划分 内存迭代计算 Spark是怎么做内存计算的? DAG的作用?Stage阶段划分的作用? Spark为什么比MapReduce快&#xff1f; Spa…...

PCIE Order Set

1 Training Sequence Training Sequence是由Order Set(OS) 组成&#xff0c;它们主要是用于bit aligment&#xff0c;symbol aligment&#xff0c;交换物理层的参数。当data_rate 2.5GT or 5GT 它们不会被扰码(scramble)&#xff0c;当date_rate 8GT or higher 根据特殊的规则…...

nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析(下)

目录 7. 实现一个UDP健康检测功能7.1 功能定义7.2 定义一个新的健康检测类型7.3 增加udp特定的健康检测需要的配置指令7.3.1 ngx_http_upstream_check_srv_conf_s结构体的扩展7.3.2 check_udp_send的实现7.3.3 check_udp_expect的实现7.3.4 16进制解码代码的实现7.4 ngx_http_u…...

基于SSM的网络在线考试系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的网络在线考试系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …...

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…...

python+flask人口普查数据的应用研究及实现django

作为一款人口普查数据的应用研究及实现&#xff0c;面向的是大多数学者&#xff0c;软件的界面设计简洁清晰&#xff0c;用户可轻松掌握使用技巧。在调查之后&#xff0c;获得用户以下需求&#xff1a; &#xff08;1&#xff09;用户注册登录后&#xff0c;可进入系统解锁更多…...

C语言:函数

C语言&#xff1a;函数 函数的概念库函数自定义函数实参与形参return语句数组做参数声明与定义externstatic 嵌套调用 函数的概念 在C语言中&#xff0c;存在一个函数的概念&#xff0c;有人也将其翻译为子程序。 在数学中&#xff0c;函数是一个完成特定功能的公式&#xff0…...

jmeter-问题一:关于线程组,线程数,用户数详解

文章目录 jmeter参数介绍1.线程数2.准备时长(Ramp-up)3.循环次数4.same user on each iteratio5.调度器 场景一&#xff1a;当你的线程组中线程数为1,循环为1场景二&#xff1a;当你的线程组中线程数为2&#xff0c;循环为1场景三&#xff1a;当你的线程组中线程数为1&#xff…...

golang 通过 cgo 调用 C++ 库

思路 将 C 库包装成 C 库 -> golang 通过 cgo 调用 C 库 C 相关文件 目录列表 include/ some.h C 库头文件some_wrapper.h < 用于将 C 库包装成 C 库的头文件 lib/ libsome.a C 库 src/ some_wrapper.cpp < 用于将 C 库包装成 C 库的源码文件 源码示例 some.h…...

使用 IDEA 开发一个简单易用的 SDK

目录 一、什么是 SDK 二、为什么要开发 SDK 三、开发 SDK 的详细步骤 四、导入 SDK 进行测试 附&#xff1a;ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义&#xff1a;软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…...

CSS transition(过渡效果)详解

CSS过渡效果&#xff08;Transition&#xff09;是一种在CSS3中引入的动画效果&#xff0c;它允许开发者在元素状态变化时&#xff08;如鼠标悬停、类更改等&#xff09;平滑地改变CSS属性值&#xff0c;从而创建出平滑的动画效果。过渡效果可以应用于多种CSS属性&#xff0c;如…...

Android13多媒体框架概览

Android13多媒体框架概览 Android 多媒体框架 Android 多媒体框架旨在为 Java 服务提供可靠的接口。它是一个系统&#xff0c;包括多媒体应用程序、框架、OpenCore 引擎、音频/视频/输入的硬件设备&#xff0c;输出设备以及一些核心动态库&#xff0c;比如 libmedia、libmedi…...

一文读懂:MybatisPlus从入门到进阶

快速入门 简介 在项目开发中&#xff0c;Mybatis已经为我们简化了代码编写。 但是我们仍需要编写很多单表CURD语句&#xff0c;MybatisPlus可以进一步简化Mybatis。 MybatisPlus官方文档&#xff1a;https://www.baomidou.com/&#xff0c;感谢苞米豆和黑马程序员。 Mybat…...

C语言--------指针(1)

0.指针&指针变量 32位平台&#xff0c;指针变量是4个字节&#xff08;32bit/84)--------x86 64位平台&#xff0c;指针变量是8个字节&#xff08;64bit/88)--------x64 编号指针地址&#xff1b;我们平常讲的p是指针就是说p是一个指针变量&#xff1b; ************只要…...

Vite 下一代的前端工具链,前端开发与构建工具

一、Vite 简介 官方中文网站&#xff1a;Vite | 下一代的前端工具链 官方定义&#xff1a; Vite&#xff0c;下一代的前端工具链&#xff0c;为开发提供极速响应。 Vue3.4版本&#xff0c;Vue新版本使用Vite构建、开发、调试、编译。 Vite的优势 极速的服务启动 使用原生…...

【SpringBoot】FreeMarker视图渲染

目录 一、FreeMarker 简介 1.1 什么是FreeMarker&#xff1f; 1.2 Freemarker模板组成部分 1.3 为什么要使用FreeMarker 二、Springboot集成FreeMarker 2.1 配置 2.2 数据类型 2.2.1 字符串 2.2.2 数值 2.2.3 布尔值 2.2.4 日期 2.3 常见指令 2.3.2 assign 2.3…...

巴尔加瓦算法图解:算法运用。

树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个节点&#xff0c;左子节点的值都比它小&#xff0c;…...

Docker的镜像和容器的区别

1 Docker镜像 假设Linux内核是第0层&#xff0c;那么无论怎么运行Docker&#xff0c;它都是运行于内核层之上的。这个Docker镜像&#xff0c;是一个只读的镜像&#xff0c;位于第1层&#xff0c;它不能被修改或不能保存状态。 一个Docker镜像可以构建于另一个Docker镜像之上&…...

忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际

RAG&#xff08;检索增强生成&#xff09;设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。 然而&#xff0c;重点主要是改进检索工具的效率&#xff0c;如嵌入式搜索、混合搜索和微调嵌入&#xff0c;而不是智能搜索。 这篇文章介绍了一种新的方法&#xff0c;灵感…...

利用路由懒加载和CDN分发策略,对Vue项目进行性能优化

目录 一、Vue项目 二、路由懒加载 三、CDN分发策略 四、如何对Vue项目进行性能优化 一、Vue项目 Vue是一种用于构建用户界面的JavaScript框架&#xff0c;它是一种渐进式框架&#xff0c;可以用于构建单页应用&#xff08;SPA&#xff09;和多页应用。Vue具有简单易学、灵…...

【Scala】1. 变量和数据类型

1. 变量和数据类型 1.1 for begining —— hello world 新建hello.scala文件&#xff0c;注意object名字与文件名一致。 object hello { def main(args:Array[String]): Unit { println("hello world!") } }运行后打印结果如下&#xff1a; hello world!Pr…...

何时以及如何选择制动电阻

制动电阻的选择是优化变频器应用的关键因素 制动电阻器在变频器中是如何工作的&#xff1f; 制动电阻器在 VFD 应用中的工作原理是将电机减速到驱动器设定的精确速度。它们对于电机的快速减速特别有用。制动电阻还可以将任何多余的能量馈入 VFD&#xff0c;以提升直流母线上的…...

消息中间件:Puslar、Kafka、RabbigMQ、ActiveMQ

消息队列 消息队列&#xff1a;它主要用来暂存生产者生产的消息&#xff0c;供后续其他消费者来消费。 它的功能主要有两个&#xff1a; 暂存&#xff08;存储&#xff09;队列&#xff08;有序&#xff1a;先进先出 从目前互联网应用中使用消息队列的场景来看&#xff0c;…...

Rust开发WASM,浏览器运行WASM

首先需要安装wasm-pack cargo install wasm-pack 使用cargo创建工程 cargo new --lib mywasm 编辑Cargo.toml文件&#xff0c;修改lib的类型为cdylib&#xff0c;并且添加依赖wasm-bindgen [package] name "mywasm" version "0.1.0" edition "…...

Vue3编写简单的App组件(二)

一、Vue3页面渲染基本流程 1、入口文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content"widthde…...

java Servlet 云平台教学系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP 云平台教学系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 系统采用serlvet dao bean&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据…...

QT初始程序

#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();} 解释&#xff1a; Qt系统提供的类头文件没有.h后缀Qt一个类对应一个头文件&#xff0c;类名和头文件名一致QA…...

ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image

ubuntu22.04laptop OpenCV Get Started: 001_reading_displaying_write_image 1. 源由2. Read/Display/Write应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 过程分析3.1 导入OpenCV库3.2 读取图像文件3.3 显示图像3.4 保存图像文件 4. 总结5. 参考资料 1. 源由 读、写、显示图像…...

51单片机之LED灯模块篇

御风以翔 破浪以飏 &#x1f3a5;个人主页 &#x1f525;个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…...

springboo冬奥会科普平台源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理平台应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…...

改进神经网络

Improve NN 文章目录 Improve NNtrain/dev/test setBias/Variancebasic recipeRegularizationLogistic RegressionNeural networkother ways optimization problemNormalizing inputsvanishing/exploding gradientsweight initializegradient checkNumerical approximationgrad…...

HarmonyOS 开发学习笔记

HarmonyOS 开发学习笔记 一、开发准备1.1、了解ArkTs语言1.2、TypeScript语法1.2.1、变量声明1.2.2、条件控制1.2.3、函数1.2.4、类和接口1.2.5、模块开发 1.3、快速入门 二、ArkUI组件2.1、Image组件2.2、Text文本显示组件2.3、TextInput文本输入框组件2.4、Button按钮组件2.5…...

maven java 如何打纯源码zip包

一、背景 打纯源码包给第三方进行安全漏洞扫描 二、maven插件 项目中加入下面的maven 插件 <!-- 要将源码放上去&#xff0c;需要加入这个插件 --><plugin><artifactId>maven-source-plugin</artifactId><version>2.4</version><con…...

Altium Designer(AD)原理图库添加阵列管脚图文教程及视频演示

🏡《专栏目录》 目录 视频演示1,概述2,添加方法3,总结视频演示 Altium Designer(AD24)原理图库添加阵列管脚 欢迎点击浏览更多高清视频演示 1,概述...

P3647 题解

文章目录 P3647 题解OverviewDescriptionSolutionLemmaProof Main Code P3647 题解 Overview 很好的题&#xff0c;但是难度较大。 模拟小数据&#xff01;——【数据删除】 Description 给定一颗树&#xff0c;有边权&#xff0c;已知这棵树是由这两个操作得到的&#xff1…...

Vivado Tri-MAC IP的例化配置(三速以太网IP)

目录 1 Tri-MAC IP使用RGMII接口的例化配置1.1 Data Rate1.2 interface配置1.3 Shared Logic配置1.4 Features 2 配置完成IP例化视图 1 Tri-MAC IP使用RGMII接口的例化配置 在网络设计中&#xff0c;使用的IP核一般为三速以太网IP核&#xff0c;使用时在大多数场景下为配置为三…...

交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。

随着社交网络的发展和普及&#xff0c;人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物&#xff0c;它利用移动互联网的便利性&#xff0c;将同城内的人们连接在一起&#xff0c;打破了时空的限制&#…...

uni-app 经验分享,从入门到离职(三)——关于 uni-app 生命周期快速了解上手

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;什么是生命周期&#x1f9e9;应用生命周期&#x1f4cc; 关于 App.vue/App.uvue &#x1f9e9;页面生命周期&#x1f4cc;关于 onShow 与 onLoad 的区别 &#x1f9e9;组件生命周期 &#x1f4dd;最后 &#x1f4cb;前言 这…...

PostgreSQL 与 MySQL 相比,优势何在?

我们将通过一张对比表格详细列出 PostgreSQL 与 MySQL 在不同方面的对比&#xff1a; 对比表格 特性/数据库PostgreSQLMySQL数据类型支持支持JSON/JSONB、数组、区间等高级数据类型基本数据类型支持&#xff0c;JSON支持较普通遵循SQL标准更严格遵循&#xff0c;支持复杂查询…...