- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章数据库的用户帐号管理基础知识由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
MySQL管理员应该知道怎样通过指定哪些用户可连接到服务器、从哪里进行连接,以及在连接时做什么,来设置MySQL用户账号。MySQL3.22.11引入了两个更容易进行这项工作的语句:GRANT语句创建MySQL用户并指定其权限,REVOKE语句删除权限。这两个语句充当mysql数据库中的授权表的前端,并提供直接操纵这些表内容的可选择的方法。GRANT和REVOKE语句影响以下四个表:
授权表内容 。
user可连接到服务器的用户和他们拥有的任何全局特权 。
db数据库级的特权 。
tables_priv表级特权 。
columns_priv列级特权 。
还有第五个授权表(host),但它不受GRANT或REVOKE的影响.
当您为某个用户发布GRANT语句时,应在user表中为该用户创建一个项。如果该语句指定了所有全局特权(管理权限或用于所有数据库的权限),则这些指定也被记录在user表中。如果指定了数据库、表或列的权限,它们将记录在db、tables_priv和columns_priv表中.
使用GRANT和REVOKE语句比直接修改授权表更容易。但是,建议您最好通过阅读第12章来补充本章的内容,第12章中详细讨论了授权表。这些表非常重要,作为一位管理员应该了解这些表是怎样在GRANT和REVOKE语句级上工作的.
本节下面的部分将讨论如何设置MySQL用户的账号和授权,还将介绍如何取消权限以及从授权表中删除全部用户,并且将考虑一个困扰许多新的MySQL管理员的难题.
您还要考虑使用mysqlaccess和mysql_setpermission脚本,它们是MySQL分发包的组成部分。这些是Perl的脚本,它们提供了设置用户账号的GRANT语句的代用品。mysql_setpermission需要具有DBI的支持环境.
创建新用户和授权 。
GRANT语句的语法如下:
GRANTprivileges(columns) 。
ONwhat 。
TOuserIDENTIFIEDBY"password" 。
WITHGRANTOPTION 。
要使用该语句,需要填写以下部分:
privileges分配给用户的权限。下表列出了可在GRANT语句中使用的权限说明符:
权限说明符权限允许的操作 。
上表显示的第一组权限说明符适用于数据库、表和列。第二组说明符是管理特权。通常,这些权限的授予相当保守,因为它们会影响服务器的操作(例如,SHUTDOWN特权不是按每天来分发的权限)。第三组说明符是特殊的。ALL的意思是“所有的权限”,而USAGE的意思是“无权限”─即创建用户,但不授予任何的权限.
columns权限适用的列。这是可选的,只来设置列专有的权限。如果命名多于一个列,则用逗号分开.
what权限应用的级别。权限可以是全局的(适用于所有数据库和所有的表)、数据库专有的(适用于某个数据库中的所有表),或表专有的。可以通过指定一个COLUMNS子句将权限授予特定的列.
user使用权限的用户。它由用户名和主机名组成。在MySQL中,不仅指定谁进行连接,还要指定从哪里连接。它允许您拥有两个带有相同名字的、从不同位置连接的用户。MySQL允许在它们之间进行区别并相互独立地分配权限.
MySQL的用户名就是您在连接到服务器时指定的名字。该名字与您的UNIX注册名或Windows名的没有必然连系。缺省设置时,客户机程序将使用您注册的名字作为MySQL的用户名(如果您不明确指定一个名字的话),但这只是一个约定。有关将root作为可以操作一切MySQL的超级用户名也是这样,就是一种约定。您也可以在授权表中将此名修改成nobody,然后作为nobody用户进行连接,以执行需要超级用户特权的操作.
password分配给该用户的口令。这是可选的。如果您不给新用户指定IDENTIFIEDBY子句,该用户不分配口令(是非安全的)。对于已有的用户,任何指定的口令将替代旧口令。如果不指定新口令,用户的旧口令仍然保持不变。当您确实要使用IDENTIFIEDBY时,该口令串应该是直接量,GRANT将对口令进行编码。当用SETPASSWORD语句时,不要使用PASSWORD()函数.
WITHGRANTOPTION子句是可选的。如果包含该子句,该用户可以将GRANT语句授予的任何权限授予其他的用户。可以使用该子句将授权的能力授予其他的用户.
用户名、口令以及数据库和表的名称在授权表项中是区分大小写的,而主机名和列名则不是.
通过查询某些问题,通常可以推断出所需的GRANT语句的类型:
谁可以进行连接,从哪里连接?
用户应具有什么级别的权限,这些权限适用于什么?
允许用户管理权限吗?
让我们来提问这些问题,同时看一些利用GRANT语句设置MySQL用户账号的例子.
1.谁可以进行连接,从哪里连接 。
您可以允许用户在特定的主机或涉及范围很宽的一组主机中进行连接。在一个极端,如果知道用户将仅从那个主机中进行连接,则可限定对单个主机的访问:
GRANTALLONsamp_db.*TOboris@localhostIDENTFIEDBY"ruby" 。
GRANTALLONsamp_db.*TOfred@ares.mars.netIDENTFIEDBY"quartz" 。
(符号samp_db.*含义是“在samp_db数据库中的所有表”)在另一个极端,您可能会有一个用户max,他周游世界并需要能够从世界各地的主机中进行连接。在这种情况下,无论他从哪里连接您都将允许:
GRANTALLONsamp_db.*TOmax@%IDENTFIEDBY"diamond" 。
‘%'字符起通配符的作用,与LIKE模式匹配的含义相同,在上个语句中,它的意思是“任何主机”。如果您根本不给出主机名部分,则它与指定“%”的含义相同。因此,max和max@%是等价的。这是设置一个用户最容易的方法,但安全性最小.
要想采取妥协的办法,可允许用户在一组有限的主机中进行连接。例如,要使mary从snake.net域的任何主机中进行连接,可使用%.snake.net主机说明符:
GRANTALLONsamp_db.*TOmary@%.snake.netIDENTFIEDBY"topaz" 。
该用户标识符的主机部分可用IP地址而不是主机名给出(如果愿意的话)。可以指定一个直接的IP地址或包含模式字符的地址。同样,自MySQL3.23起,可以用一个网络掩码来指定IP号,网络掩码表明了用于该网络号的二进制位数:
GRANTALLONsamp_db.*TOjoe@192.168.0.3IDENTIFIEDBY"water" 。
GRANTALLONsamp_db.*TOardis@192.168.128.%IDENTIFIEDBY"snow" 。
GRANTALLONsamp_db.*TOrex@192.168.128.0/17IDENTIFIEDBY"ice" 。
第一条语句指明用户可进行连接的特定的主机。第二条语句指定129.168.128ClassC子网的IP模式。在第三条语句中,192.168.128.0/17指定一个17位二进制的网络号,并将任何主机与其IP地址的前17个二进制位中的192.168.128.0/17进行匹配.
如果MySQL抱怨您指定的用户值,则可能需要使用引号(但对用户名和主机名分别加引号):
GRANTALLONsamp_db.presidentTO"myfriend"@"boa.snake.net" 。
2.用户应具有什么级别的权限,这些权限适用于什么 。
您可授予不同级别的权限。全局权限的功能最强,因为它们适用于任何数据库。为了使ethel成为可以进行一切操作的超级用户(其中包括可以对其他用户授权),发布下列语句:
GRANTALLON*.*TOethel@localhostIDENTIFIEDBY"coffee" 。
WITHGRANTOPTION 。
ON子句中*.*说明符的意思是“所有数据库,所有的表”,为保险起见,我们已经指定ethel只能从本地主机中连接。限制超级用户从哪些主机上进行连接通常是明智的做法,因为它限制住了其他用户对口令进行试探.
有些权限(FILE、PROCESS、RELOAD和SHUTDOWN)是管理权限,只能用NO*.*全局权限说明符来授予。如果希望的话,也可以不用授予数据库级的权限来授予这些权限。例如,下列语句建立了一个flush用户,它除了发布FLUSH语句外不做其他任何事情。在管理脚本中这可能是有用的,因为需要在这些脚本中执行诸如在日志文件循环期间刷新日志的操作:
GRANTRELOADON*.*TOflush@localhostIDENTIFIEDBY"flushpass" 。
通常授予管理权限应该是保守的,因为具有这些权限的用户可能影响服务器的操作.
数据库级的权限适用于特定数据库中的所有表。这些权限使用ONdb_name.*子句进行授予:
GRANTALLONsamp_db.*TObill@racer.snake.netIDENTIFIEDBY"rock" 。
GRANTSELECTONmenagerie.*TOro_user@%IDENTIFIEDBY"dirt" 。
第一条语句将bill的所有权限授予samp_db数据库的任何表。第二条语句创建一个限制访问的用户ro_user(只读用户),它可以访问menagerie数据库的所有表,但只能读取。也就是说,该用户只能发布SELECT语句.
怎样在授权表项中指定本地主机名 。
如果您使用服务器的主机名而非localhost,通常存在从该服务器主机连接的问题。这可能是由于在授权表中指定名字的方法和名字分解器例程(nameresloverroutine)向程序报告名字的方法之间的错误匹配。如果分解器报告了一个非限定的名字(如pit-viper),但授权表包含了具有全限定的名字的项(如pit-viper.snake.net,反之亦然),则发生错误匹配.
为了确定这种情况是否正在系统中发生,可试着用-h选项连接到本地服务器,该选项指定了主机的名字。然后查看服务器的常规日志文件。它是怎样报告主机名的?是以非限定形式还是限定形式?不论它是哪种形式,都将告诉您在发布GRANT语句时需要怎样指定用户说明符的主机名部分.
可以同时列出许多被授予的单个权限。例如,如果想让用户能读取和修改已有表的内容,但又不允许创建新表或删除表,可按如下授权:
GRANTSELECT,INSERT,DELETE,UPDATEONsamp_db.*TOjennie@% 。
IDENTIFIEDBY"boron" 。
对于更小粒度(fine-grained)的访问控制,可以在单个表上授权,甚至在表的单个列上授权。当存在要对用户隐藏的表时,或者,当只允许用户修改特定列时,列专有的权限是有用的。假定历史同盟会中有一些志愿者利用您作为同盟会秘书应履行的职责来帮助您工作。这是一个好消息,但您决定首先给新的助手授予对member表只读的权限(该表中包含了会员资格的信息),然后再对他们增加授予该表的expiration列的列专有UPDATE权限。也就是说,您的助手可以在人们更新其会员资格时进行更改 。
第一条语句授予对整个member表的读访问权并设置口令。第二条语句增加UPDATE权限,但只是对expiration列。此时不必要再指定口令,因为在第一条语句中已经完成了.
截止日期的工作。设置此MySQL用户的语句如下:
如果想要为多个列授予列专有的权限,可指定一个列清单,并用逗号将这些列分隔。例如,为了给assistant用户增加对member表地址列的UPDATE权限,可以使用下列语句。新的权限将被增加到对该用户来说已经存在的所有列上:
GRANTUPDATE(street,city,state,zip)ONsamp_db.member 。
TOassistant@localhost 。
通常,不要给用户授予比实际需要更大的权限。但是,当您想要使用户能够创建存储中间结果的临时表,而又不允许用户在包含有他们不能修改的数据的数据库中这样做时,就有了要在数据库上授予相当多的许可权限的理由。您可以建立一个单独的数据库(笔者称它为tmp)并授予用户该数据库的所有权限。例如,如果想要mars.net域的主机中的任何用户都能够使用tmp数据库,可发布下列GRANT语句:
GRANTALLONtmp.*TO""@%.mars.net 。
在完成这些之后,用户可使用tmp.tbl_name格式的名字创建和引用tmp数据库中的表(用户说明符中的“”创建一个匿名用户项,任何用户都与空白用户名相匹配).
3.允许用户管理权限吗 。
通过授予数据库所有者数据库的所有权限并在操作时指定WITHGRANTOPTION,可以允许数据库所有者控制对该数据库的访问。例如,如果要让alicia能在big.corp.com域的所有主机中进行连接并管理sales数据库中所有表的权限,应使用下列GRANT语句:
实际上,WITHGRANTOPTION子句允许将访问的权利授予给另一个用户。要知道,具有GRANT权限的两个用户可以相互授予自己的权限。如果只给一个用户授予SELECT权限而给另一个用户除SELECT外还授予了GRANT和其他的权限,则第二个用户可以使第一个用户“强大”起来.
取消权限和删除用户 。
为了收回某个用户的权限,可使用REVOKE语句。除了要用FROM替换TO并且没有IDENTIFIEDBY或WITHGRANTOPTION子句外,REVOKE的语法与GRANT语句非常相似:
REVOKEprivileges(columns)ONwhatFROMuser 。
user部分必须与您想要取消其权限的用户的原始GRANT语句的user部分相匹配。privileges部分不需要匹配,您可用GRANT语句授权,然后用REVOKE语句取消其中的一部分。REVOKE语句只删除权限,不删除用户。用户的项仍然保留在user表中,即使您取消了该用户的所有权限也是如此。这意味着该用户仍然可连接到服务器上。要想删除整个用户,必须用DELETE语句将该用户的记录从user表中直接删除:
DELETE语句删除该用户的项,FLUSH语句告诉服务器重新加载授权表(当使用GRANT或REVOKE语句,而不是直接修改授权表时,这些表将自动重新加载).
一个权限难题,第一部分 。
下面是一个在MySQL邮件清单中反复出现的情况:一位新的MySQL管理员给某用户增加一个项,使用了主机名部分,该部分是用一个模式来指定的。例如:
GRANTALLONsamp_db.*TOfred@%.snake.netIDENTIFIEDBY"cocoa" 。
这里的意图是允许用户fred从snake.net域的所有主机中进行连接,并且具有对samp_db数据库的所有权限。事实上,fred能够从那些主机中连接(除了服务器主机本身外)。当fred试着从服务器主机中进行连接时,该企图以“访问被拒绝”的消息而告失败。即使用户指定了正确的口令也是如此.
如果授权表中包含了由mysql_install_db安装脚本安装的缺省项,这种情况也会发生。其原因是,当服务器验证fred连接的企图时,一个匿名用户项(anonymous-userentry)比fred项优先。匿名用户项要求该用户不用口令来连接,并且一个口令错误匹配发生.
该问题的另一个背景将在第12章“权限难题,第二部分”中给出。目前,只要说修正此问题的方法是从user表中删除匿名用户项就足够了,我们不能用REVOKE,因为该命令只删除权限。要想完全摆脱这些匿名项,执行如下操作:
%mysql-urootmysqlmysql>DELETEFROMuserwhereUser="",
mysql>FLUSHPRIVILEGES,
现在,当fred试图从本地主机连接时成功了.
最后此篇关于数据库的用户帐号管理基础知识的文章就讲到这里了,如果你想了解更多关于数据库的用户帐号管理基础知识的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
积累和总结,是长期持续的过程 01 最近,很多朋友微信私聊关于「 butte-java-note 」仓库的话题; 这个「 Git仓库 」每年都会
我即将参加挑战测试,所以我不必参加数据库处理类(class)。尽管在过去的 5 年里我一直在使用数据库,但我还是忍不住对测试感到紧张。这是 50 个问题,有 2 部分:真/假部分和我实际编写 SQL
我的 groovy 代码将 Rabbit Native Plugin 用于 grails: def handleMessage(def body, MessageContext context) {
我想看看是否有人可以就我在 .NET 环境中的进一步知识提供任何建议... 这里有一点背景。我上了一所大学并获得了计算机科学学士学位(主要从事 C、Java 和 C++ 方面的工作)。大学毕业后在一家
我在 postgres 数据库中有一个表,该表用于测试环境,我们需要一次添加和删除多个列。问题是 postgres 最多有 1600 列,并且这个计数包括丢弃的列。我的表永远不会有 1600 个“未丢
作为业余程序员 3 年(主要是 Python 和 C)并且从未编写过超过 500 行代码的应用程序,我发现自己面临两个选择: (1) 学习数据结构和算法设计的基本知识,使我成为一名 l33t 计算机科
有人能告诉我为什么 Android 工作需要 Linux 知识吗?许多 Android 工作都以 Linux 作为先决条件。我可以很好地从 Windows 机器开发 Android 应用程序吗? 最佳
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
是否可以在 Drools 中保持知识 session ?如果是这样,如何? 我将事实存储在数据库中,并且每次添加新事实时,我都希望避免在新 session 中重新加载所有事实。 目前,当有新事实时,该
我对 C++ 有很好的了解,但从未深入研究 STL。我必须学习 STL 的哪一部分才能提高工作效率并减少工作中的缺陷? 谢谢。 最佳答案 I have good knowledge of C++ 恕我
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improve
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在我从 SO answers here 和许多 BackBoneJs 示例中选择的示例之一中,我看到初始化函数知道模型将使用哪个 View 进行渲染。我不知道我现在有点偏见,这是一个好的做法还是取决于
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 12 年前。 Improve thi
我在我的网站上使用 C# 和 ASP.NET MVC 3 实现 OpenID 和 OAuth。我基于 DotNetOpenAuth用于后端和openid-selector对于前端。 我喜欢 openi
很长一段时间以来,我都在思考和研究C语言编译器以汇编形式的输出,以及CPU架构。我知道这对你来说可能很愚蠢,但在我看来有些东西是非常无效的。如果我错了,请不要生气,我不明白所有这些原则是有原因的。如果
我有一些 Python 知识,但我从来不认为自己对这门语言特别流利。我正在开发一个潜在的机器视觉项目,该项目将从 SimpleCV 中受益匪浅,但从时间的角度来看,我宁愿不必非常流利地使用 pytho
我是一名优秀的程序员,十分优秀!