MySQL学习笔记之二十四 设置用户并授权

    你可以有 2 个不同的方法增加用户:通过使用 GRANT 语句或通过直接操作 MySQL 授权表。比较好的方法是使用 GRANT 语句,因为他们是更简明并且好像错误少些。 

    一、使用SHOW GRANTS语句显示用户的授权

    你可以直接查看授权表,也可以使用SHOW GRANTS语句查看某个用户的授权,这种情况下使用SHOW GRANTS语句显然要更加方便一些。

    语法:

    SHOW GRANTS FOR user_name;

    为了容纳对任意主机的用户授予的权利,MySQL 支持以 user@host 格式指定 user_name 值。 

    例如,下面的语句显示一个用户 admin 的权限: 

    mysql>SHOW GRANTS FOR admin@localhost; 

    其结果为创建该用户的 GRNAT 授权语句: 

   GRANT RELOAD, SHUTDOWN, PROCESS ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '28e89ebc62d6e19a' 

    密码是加密后的形式。 

    二、使用GRANT语句授权

    1、GRANT语句的语法

    GRANT priv_type (columns) ON what TO user IDENTIFIED BY “password” WITH GRANT OPTION 

    要使用该语句,需要填写以下部分:

    priv_type 分配给用户的权限。

    priv_type 可以指定下列的任何一个:  

    ALL PRIVILEGES      FILE                RELOAD

    ALTER                        INDEX               SELECT 

    CREATE                     INSERT              SHUTDOWN 

    DELETE                     PROCESS             UPDATE 

    DROP                        REFERENCES          USAGE 

     ALL 是 ALL PRIVILEGES 的一个同义词,REFERENCES 还没被实现,USAGE 当前 是“没有权限”的一个同义词。它能用在你想要创建一个没有权限用户的时候。

     对于表,       你能指定的唯一 priv_type 值是 SELECT、INSERT、UPDATE、DELETE、 CREATE、DROP、GRANT、INDEX 和 ALTER。 

     对于列,你能指定的唯一 priv_type 值是(即,当你使用一个 column_list 子句时)是 SELECT、INSERT 和 UPDATE。 

    columns 权限适用的列

    这是可选的,只来设置列专有的权限,如果命令多于一个列,则用逗号隔开;

    what 权限应用的级别

    GRANT 允许系统主管在4个权限级别上授权MySQL用户的权利;

    全局级别

    全局权限作用于一个给定服务器上的所有数据库。这些权限存储在 mysql.user 表中。 你能通过使用 ON *.*语法设置全局权限 

    数据库级别

    数据库权限作用于一个给定数据库的所有表。这些权限存储在 mysql.db 和 mysql.host 表中。 你能通过使用 ON db_name.*语法设置数据库权限。如果你指定 ON *并且你有

一 个当前数据库,你将为该数据库设置权限。(警告:如果你指定 ON *而你没有一个当前数 据库,你将影响全局权限!) 

    表级别

    表权限作用于一个给定表的所有列。这些权限存储在 mysql.tables_priv 表中。你能透 过 ON tbl_name,为具体的表名设置权限。 

    列级别

    列权限作用于在一个给定表的单个列。这些权限存储在 mysql.columns_priv 表中。你 可以通过指定一个 columns 子句将权限授予特定的列,同时要在 ON 子句中指定具体

的 表。 对与一个表或列的权限是由 4 个权限级别的逻辑或形成的。例如,如果 mysql.user 表 指定一个用户有一个全局 select 权限,它不能被数据库、表或列的一个条目否

认。 

    对于一个列的权限能如下计算:

    global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges 

    在大多数情况下,你只授予用户一个权限级别上的权限,因此现实通常不象上面所说的那样复杂。 

    user使用权限的用户

    为了容纳对任意主机的用户授予的权利,MySQL 支持以 user@host 格式指定 user_name 值。如果你想要指定一个特殊字符的一个 user 字符串(例如“-”),或一个包含 特殊

字符或通配符的 host 字符串(例如“%”),你可以用括号括起能用户或主机名字 (例 如,'test-user'@'test-hostname')。  

    你能在主机名中指定通配符。例如,user@"%.loc.gov"适用于在 loc.gov 域中任何主机 的user,并且 user@"144.155.166.%"适用于在 144.155.166 类 C 子网中任何主机的 

user。  

    简单形式的 user 是 user@"%"的一个同义词。注意:如果你允许匿名用户连接 MySQL 服务器(它是缺省的),你也应该增加所有本地用户如 user@localhost,因为否则, 当

用户试图从本地机器上登录到 MySQL 服务器时,对于 mysql.user 表中的本地主机的匿 名用户条目将被使用!匿名用户通过插入有 User=''的条目到 mysql.user 表中来定义。

通过 执行这个查询,你可以检验它是否作用于你: 

    mysql> SELECT Host,User FROM mysql.user WHERE User='';  

    password 分配给该用户的口令。这也是可选的。从

    在 MySQL 3.22.12 或以后,如果创建一个新用户或如果你有全局授予权限,用户的 口令将被设置为由 IDENTIFIED BY 子句指定的口令,如果给出一个。如果用户已经有了

 一个口令,它被一个新的代替。  警告:如果你创造一个新用户但是不指定一个 IDENTIFIED BY 子句,用户没有口 令。这是不安全的。 

    with grant option 子句是可选的。

    WITH GRANT OPTION 子句给与用户有授予其他用户在指定的权限水平上的任何权 限的能力。你应该谨慎对待你授予他 grant 权限的用户,因为具有不同权限的两个用户也 

许能合并权限! 

    创建用户并授权的实例

     创建一个具有超级用户权利的用户:

     mysql>GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd" ->WITH GRANT OPTION 

    该语句将在 user 表中为 anyname@localhost 创建一个记录,打开所有权限。 

    数据库级权限用一个 ON db_name.*子句而不是 ON *.*进行授权:  

    mysql>GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby" 

    这些权限不是全局的,所以它们不存储在 user 表中,我们仍然需要在 user 表中创建 一条记录(使得用户能连接),但我们也需要创建一个 db 表记录记录数据库集的权

限。 

    三、直接修改授权表创建用户并授权

    如果你还记得前面的介绍,你应该能即使不用 GRANT 语句也能做 GRANT 做的事 情。记住在你直接修改授权表时,你将通知服务器重载授权表,否则他不知道你的改变。

    你可以执行一个 mysqladmin flush-privileges 或 mysqladmin reload 命令和 FLUSH  PRIVILEGES 语句强迫一个重载。如果你忘记做这个,你会疑惑为什么服务器不做你想

做 的事情。 

    下列 GRANT 语句创建一个拥有所有权的超级用户。包括授权给别人的能力: 

    GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd"     WITH GRANT OPTION 

    该语句将在 user 表中为 anyname@localhost 创建一个记录,打开所有权限,因为这里 是超级用户(全局)权限存储的地方,要用 INSERT 语句做同样的事情,语句是:

     INSERT INTO user  VALUES("localhost","anyname",PASSWORD("passwd"),     "Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y") 

    你可能发现它不工作,这要看你的 MySQL 版本。授权表的结构已经改变而且你在你 的 user 表可能没有 14 个权限列。用 SHOW COLUMNS 找出你的授权表包含的每个权限

 列,相应地调整你的 INSERT 语句。 下列 GRANT 语句也创建一个拥有超级用户身份的 用户,但是只有一个单个的权限: 

    GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass" 

    本例的 INSERT 语句比前一个简单,它很容易列出列名并只指定一个权限列。所有 其它列将设置为缺省的"N": 

    INSERT INTO user (Host,Password,Reload) VALUES("localhost","flush",PASSWORD("flushpass"),"Y") 

    数据库级权限用一个 ON db_name.*子句而不是 ON *.*进行授权:  GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby" 这些权限不是全局的,

所以它们不存储在 user 表中,我们仍然需要在 user 表中创建 一条记录(使得用户能连接),但我们也需要创建一个 db 表记录记录数据库集权限:

    mysql> INSERT INTO user (Host,User,Password)  -> VALUES("localhost","boris",PASSWORD("ruby")) ; 

    mysql> INSERT INTO db VALUES -> ("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y"); 

   "N"列是为 GRANT 权限;对末尾的一个数据库级具有 WITH GRANT OPTION 的 GRANT 语句,你要设置该列为"Y"。 要设置表级或列级权限,你对 tables_priv 或 

columns_priv 使用 INSERT 语句。当然, 如果你没有 GRANT 语句,你将没有这些表,因为它们在 MySQL 中同时出现。如果你确 实有这些表并且为了某些原因想要手工操作

它们,要知道你不能用单独的列启用权限。 你设置 tables_priv.Table_priv 或 columns_priv.Column_priv 列来设置包含你想启用的权 限值。例如,要对一个表启用 SELECT 

和 INSERT 权限,你要在相关的 tables_priv 的记 录中设置 Table_priv 为"Select,Insert"。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值