mysql会员管理系统,MySQL管理
MySQL用户帐户管理
在这一节中,我们将讨论如何为我们的MySQL服务器客户端设置一个帐户。我们将讨论以下问题:
1 MySQL中使用的帐户的用户和密码的含义与我们的操作系统中使用的进行了比较。
2如何建立新账户和删除现有账户?
3如何更改密码
4安全密码向导
5如何使用SSL进行安全连接
MySQL用户名和密码
MySQL用户帐户是由用户名和用户可以用来连接到服务器的客户端主机或主机定义的。用户帐户也将有一个密码。MySQL和操作系统中使用的用户名和密码有一些不同:
1 MySQL用于授权目的的用户名与我们在Windows或Unix操作系统中使用的用户名无关。在Unix系统上,大多数MySQL客户端会尝试使用当前用户名作为MySQL用户名登录,但这只是为了方便。默认情况很容易被覆盖,因为客户端程序允许任何用户使用-u或- user选项。因为这意味着任何人都可以使用任何用户尝试连接到服务器,所以我们不需要以任何方式创建安全的数据库,除非第一个MySQL用户有密码。任何指定了用户名但没有密码的人都可以成功地与数据库服务器建立连接。
2 MySQL用户名最长可达16个字符。这个限制是硬编码在MySQL服务器和客户端的,试图修改MySQL数据库中表的定义的方法是行不通的。
注意:我们不应该试图以任何方式修改mysql数据库的表,除非我们使用MySQL发行版中为此目的提供的脚本。试图重新定义MySQL系统表会导致不可预知的结果。
操作系统的用户名和MySQL的用户名没有直接关系,甚至它们的最大长度也不一样。例如,Unix的最大用户名是8个字符。
MySQL的密码和我们用来登录操作系统的密码没有任何关系。登录Windows或Unix时使用的密码和访问MySQL数据库服务器时使用的密码之间没有直接联系。
MySQL使用自己的算法加密密码。这种加密不同于Unix登录过程的加密。MySQL的密码加密和PASSWORD()SQL函数实现的一样。Unix密码的加密和ENCRYPT()SQL函数实现的是一样的。
当我们使用命令行客户端建立与MySQL服务器的连接时,我们必须为将要使用的振幅指定用户名和密码:
shell MySQL-user=monty-password=guess db _ name
如果我们喜欢缩写形式,我们的命令如下:
shell MySQL-u monty-pguess db _ name
p选项和下一个密码之间没有空格。
密码包含在上面的命令中,这是一个安全风险。为了避免这种情况,我们可以指定- password或-p,而不指定后面的任何内容:
shell MySQL-user=monty-password db _ name
shell mysql -u monty -p db_name
客户端将打印出一个提示,并等待我们输入密码。
在某些系统上,MySQL用于密码提示的库调用会自动设置8个单词的限制。这是系统库的问题,不是MySQL的问题。其实MySQL是没有密码长度限制的。要解决这个问题,请将我们的MySQL密码更改为8个字符或更少,或者将我们的密码放在一个可选文件中。
添加新的MySQL帐户
我们可以通过两种方式创建MySQL帐户:
1通过使用GRANT语句
2 MySQL数据表的直接操作
更好的方法之一是使用GRANT语句,因为它们更简洁,错误更少。
创建帐户的另一个选择是使用一些可用的第三方程序,如phpMyAdmin。
以下示例显示了如何使用mysql客户端程序设置新用户。
首先,使用mysql程序以root身份与MySQL服务器建立连接:
shell mysql - user=root mysql
如果我们为root帐户设置密码,我们必须使用- password或-p选项。
以root身份连接到服务器后,我们可以添加一个新帐户。以下语句使用GRANT设置一个新帐户:
mysql授予*上的所有权限。*到 monty@localhost
-由带有授权选项的“some_pass”标识;
mysql授予*上的所有权限。*到 monty@%
-由带有授权选项的“some_pass”标识;
mysql授权重新加载,在*上处理。* TO admin @ localhost
*上的mysql授权使用。* TO dummy @ localhost
由GRANT语句创建的用户具有以下一些属性:
1这两个账号使用monty作为用户名,some_pass作为密码。这个账号是超级账号,拥有所有权限,可以做任何事情。其中一个( monty monty@localhost )只能用于来自本地机器的连接访问,另一个可以用于来自任何主机的连接访问。这里要注意的是,需要设置monty账号作为monty从任何地方连接。如果没有本地账号,从本地主机连接时,monty会优先考虑mysql_install_db为本地主机创建的匿名账号。因此,monty将被视为匿名帐户。这是因为匿名帐户有一个比“monty”@“%”更特殊的主机列,所以它们在用户表中的排名更高。
两个帐户以admin为用户,但没有密码。从本地主机连接时,可以使用此帐户。该帐户拥有重新加载和处理管理权限。这些权限可以允许管理员用户执行诸如MySQL管理重新加载、MySQL管理刷新、MySQL管理刷新XXX、MySQL管理进程列表等命令。但是无权访问数据库。我们可以稍后通过执行GRANT语句来添加这些权限。
三个帐户有虚拟用户,但没有密码。此帐户只能从本地主机连接。但是这个帐号没有任何权限。GRANT语句中的USAGE权限允许我们创建一个帐户,但没有授予他任何权限。这和把所有全局权限设置为n是一样的,MySQL会认为我们以后会给这个账号指定特殊权限。
与grant相反,我们可以通过执行insert语句并告诉服务器使用FLUSH特权重新加载GRANT表来直接创建相同的帐户:
shell mysql - user=root mysql
mysql插入用户
- VALUES(localhost , monty ,PASSWORD(some_pass ),
- Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y );
mysql插入用户
-值( % , monty ,密码( some_pass ),
- Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y , Y );
mysql插入用户集Host=localhost ,User=admin ,
- Reload_priv=Y ,Process _ priv= Y
mysql插入用户(主机、用户、密码)
- VALUES(localhost , dummy , );
mysql FLUSH特权;
我们之所以在使用INSERT语句创建帐户时使用FLUSH特权,是为了告诉服务器重新读取授权表。否则,我们的更改将不会生效,直到我们重新启动服务器。如果使用GRANT,则不需要刷新权限。
在INSERT语句中使用PASSWORD函数的原因是为了加密密码。GRANT语句已经加密了我们的密码,所以此时不需要密码。
值y设置帐户的权限。对于admin帐户,也许我们需要使用SET来获得更可读的扩展插入语法。
对于虚拟帐户的INSERT语句,只分配用户表记录中的主机、用户和密码列。permissions列中没有显式的赋值,所以MySQL将它们都设置为缺省的n。这与GRANT用法的结果相同。
这里要注意的是,设置超级用户只需要创建一个用户表实体,并将所有属性列值设置为y,用户表的权限是全局的,所以它不需要其他授权表中的任何实体。
以下示例创建了三个帐户,并授予他们对特定数据库的访问权限。它们都使用custom作为用户名,使用obscure作为密码。
shell mysql - user=root mysql
mysql授权选择、插入、更新、删除、创建、删除
-银行账户上。*
- TO custom@localhost
-由“模糊”标识;
mysql授权选择、插入、更新、删除、创建、删除
-费用方面。*
-转到“custom ”@“white house . gov”
-由“模糊”标识;
mysql授权选择、插入、更新、删除、创建、删除
-在客户身上。*
- TO custom@server.domain
-由“模糊”标识;
这三个帐户可以如下使用:
1第一个帐户可以访问bankaccount数据库,但它只能从本地主机连接。
第二个帐户可以访问费用数据库,但只能从whitehouse.gov主机访问。
3第三个帐户可以访问客户数据库,但是可以从。
要设置没有授权的客户帐户,您可以使用INSERT语句直接修改授权表,如下所示:
shell mysql - user=root mysql
mysql插入用户(主机、用户、密码)
- VALUES(localhost , custom ,PASSWORD( obscure ));
mysql插入用户(主机、用户、密码)
- VALUES(whitehouse.gov , custom ,PASSWORD( obscure ));
mysql插入用户(主机、用户、密码)
- VALUES(server.domain , custom ,PASSWORD( obscure ));
mysql插入数据库
-(主机,数据库,用户,选择权限,插入权限,
-更新权限,删除权限,创建权限,删除权限)
- VALUES(localhost , bankaccount , custom ,
-- Y , Y , Y , Y , Y );
mysql插入数据库
-(主机,数据库,用户,选择权限,插入权限,
-更新权限,删除权限,创建权限,删除权限)
- VALUES(whitehouse.gov , expenses , custom ,
-- Y , Y , Y , Y , Y );
mysql插入数据库
-(主机,数据库,用户,选择权限,插入权限,
-更新权限,删除权限,创建权限,删除权限)
-值( server.domain , customer , custom ,
-- Y , Y , Y , Y , Y );
mysql FLUSH特权;
前三个INSERT语句添加了用户表实体,它允许自定义用户作为指定的密友从各种主机进行连接,但不授予全局权限(所有权限都设置为default N)。接下来的三个INSERT语句添加db表实体,授予对bankaccount、expenses、customer数据库和custom的权限,但是这需要来自适当主机的连接。像往常一样,当我们直接修改授权表时,我们使用FLUSH特权来告诉服务器重新加载,这样这些特权才会生效。
如果我们希望指定用户可以从指定的域(例如,mydomain.com)访问,我们可以在帐户名的主机部分使用%通配符来执行GRANT语句:
mysql授权.
-在*。*
-发送到“我的名字”@“% . my domain . com”
-由“我的通行证”标识;
如果我们想直接修改授权表来完成同样的事情,我们可以这样做:
mysql插入用户(主机,用户,密码,)
- VALUES(%.mydomain.com , myname ,PASSWORD(mypass ),);
mysql FLUSH特权;
限制帐户资源
限制服务器资源的一种方法是将系统变量max_user_connection设置为非零值。但是,这种方法更严格地说是全局的,不允许管理单个帐户。此外,该方法仅限制使用单个帐户的同时连接数,而不限制该帐户一旦连接后将执行的操作。这两种类型的控件都是MySQL系统管理员感兴趣的,尤其是那些为网络服务提供商工作的管理员。
在MySQL 5中。0,对于单个帐户,我们可以拥有以下一些服务器资源:
1每个账户每小时的查询次数
2每个帐户每小时的更新次数。
3每个帐户每小时可以连接到服务器的次数。
客户端执行的任何语句都属于查询限制。只有修改数据库或数据表的语句才属于更新限制。
从MySQL 5.0.3开始,我们还可以根据每个帐户限制同时连接到服务器的数量。
这里提到的帐户是指用户表中的记录。每个帐户由其用户和主机列值唯一标识。
使用该功能的前提是mysql数据库中的用户表必须包含与资源相关的列。受限内容存储在Max _ questions、Max _ updates、Max _ connections和Max _ user _ connections列中。如果我们的用户表中没有这些列,那么我们必须更新它们。
使用GRANT语句设置资源限制,并使用包含要限制的资源名称和每小时数量的子句来指示限制值。例如,我们创建一个可以访问客户数据库的帐户,但是有一些限制,我们可以执行下面的语句:
mysql授权所有客户。*到“Francis”@“localhost”
-由“弗兰克”识别
-每小时最大查询数为20
-每小时最大更新数10
-每小时最大连接数5
-MAX _ USER _ CONNECTIONS 2;
限制的类型不一定都在WITH子句中列出,但是这些列出的内容可以按任何顺序排列。每个小时的极限值应该是代表每个小数量的整数。如果GRANT语句中没有WITH子句,这些限制将被设置为默认值零(即没有限制)。对于MAX_USER_CONNECTIONS,限制值是一个整数,用于指示该帐户在任何时候可以同时建立的连接数。如果将该限制值设置为默认值零,则max_user_connections系统变量将用于确定该帐户的同时连接数。
要设置或更改现有帐户,我们可以使用GRANT USAGE语句在全局级别设置它。以下示例将francis的查询限制设置为100:
*上的mysql授权使用。*到“Francis”@“localhost”
-每小时最大查询数为100;
该语句保持帐户的现有权限不变,只修改指定的限制值。
要删除设置的限制,您可以将其设置为零。例如,要删除francis每小时可以建立的连接数,我们可以使用以下语句:
*上的mysql授权使用。*到“Francis”@“localhost”
-每小时最大连接数为0;
当任何帐户对任何资源使用有非零限制时,资源使用计数将生效。
作为服务器,他统计每个账户使用资源的次数。如果一个帐户在最后一个小时达到其连接限制,该帐户的更多连接将在该小时结束前耗尽。同样,如果一个帐户达到其查询或更新限制,更多的查询或更新将被耗尽,直到这一小时结束。在所有这些情况下,将执行适当的错误消息。资源计数是针对每个帐户进行的,而不是针对每个客户端。比如我们的账户查询的限额是50,同时连接两个客户端到服务器是达不到100的。同时查询的数量被计算在一起。
可以为所有用户全局重置当前每小时的资源使用情况,也可以为每个用户单独设置:
1要将所有使用的帐户的当前计数值设置为零,我们可以执行一个FLUSH PRIVILEGES语句或mysqladmin reload命令。
2我们可以通过重置一个用户的限制项,将单个用户的限制值设置为零。为此,我们可以使用前面提到的授权使用方法。
为帐户设置密码。
的帐户密码可以通过在命令中使用mysqladmin命令来设置:
shell mysqladmin -u用户名-h主机名密码 newpwd
这个密码设置命令设置的帐户是Host列的值的记录,它与User表的User _ name相匹配并连接我们。
为帐户设置密码的另一种方法是执行SET PASSWORD语句:
mysql为 jeffrey@%=PASSWORD(饼干);
只有像root这样对mysql数据库有更新权限的用户才能为其他账户设置密码。如果我们不是以匿名用户身份登录,我们可以省略FOR子句来设置我们自己的密码:
mysql设置密码=密码(饼干);
我们还可以在全局级别使用GRANT USAGE语句来设置帐户的密码,而不是影响该帐户的当前权限:
*上的mysql授权使用。*以‘Jeffrey’@‘%’标识为‘饼干’;
虽然我们倾向于使用上述方法之一来设置用户密码,但我们也可以通过直接修改用户数据表来修改帐户密码:
1要在创建新帐户时设置密码,请为“密码”列提供一个值:
shell mysql -u root mysql
mysql插入用户(主机、用户、密码)
- VALUES(% , jeffrey ,PASSWORD( biscuit ));
mysql FLUSH特权;
2要修改帐户的密码,请使用更新来设置密码列的值:
shell mysql -u root mysql
mysql更新用户设置密码=密码( bagel )
-其中主机=“%”,用户=“Francis”;
mysql FLUSH特权;
当我们使用SET PASSWORD、INSERT或UPDATE来设置帐户的密码时,我们必须使用PASSWORD函数来加密它。(但是如果密码是空的,我们就不需要这么做了)。密码功能是必要的,因为用户数据表存储的是加密形式,而不是普通文本。如果我们忘记了这一点,我们可能会使用以下方法来设置密码:
shell mysql -u root mysql
mysql插入用户(主机、用户、密码)
-VALUES(“%”、“jeffrey”、“biscuit”);
mysql FLUSH特权;
因此,饼干将作为密码而不是加密值存储在用户数据表中。当jeffrey尝试使用该密码连接到服务器时,该值被加密,然后与存储在用户数据表中的值进行比较。然而,实际的饼干字符串被存储,所以这种比较将失败,并且服务器将拒绝这种连接:
shell mysql -u jeffrey -pbiscuit测试
拒绝访问
如果我们用格兰特。通过语句或mysqladmin密码命令识别,他们还会小心翼翼地为我们加密密码。在这些情况下,密码功能是不必要的。
这里要注意的是,密码函数的加密不同于Unix的密码加密。