通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 my小屋
联系我们
设为首页
加入收藏

 

qq,asp,php,jsp,xml,sql,.net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | q q 专栏 | 建站经验 | 在线工具 | 站长club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>在线服务>>疑难解答>>正文 新版上线![旧版]
注:打开慢时请稍等

如何实现mysql中的用户管理?

http://www.iyit.net  日期:2006-5-3 19:23:06  来源:  点击:
参加讨论】 mysql有一套先进的但非标准的安全/授权系统,掌握其授权机制是开始操作mysql数据库必须要走的第一步,对于一个熟悉sql基本操作的人来说,也是mysql所有的知识中比较难以理解的一个部分。本文通过揭开其授权系统的运作机制,希望大家能够可以更好地操作和使用这个优秀的数据库系统。

本文主要参考了mysql安装所附的使用手册第六章中的部分内容。如果有任何疑问,请和我联系(lidong@wh.027.net)

1、授权机制的主要作用是什么?

授权机制的基本作用是给某个主机上的用户对某个数据库以select,insert,update和detete的权限。而其额外的功能还包括是否允许匿名使用数据库,使用mysql的一些特定函数,如:load data infile之类。在这里请注意,mysql中的用户名和unix系统中的用户名并没有什么关系。虽然许多客户端程序允许你可以用当前的用户名进行登录,但是最标准的做法还是通过--user的选项。
 
2、授权机制是如何进行运作的?

在mysql中主机和用户的联合视为唯一标志。比如说,在主机1和主机2上的用户lee实际上是不同的,他们对mysql的使用权限也可以是有差别的。而整个授权机制的核心问题就是要解决授予从某个主机上登录的某个用户对某个数据库的使用权限。你可以通过脚本mysqlaccess测试一个主机上用户的对数据库操作的权限。而所有的授权信息都被存储在数据库mysql的user、host和db表中。我们可以通过mysql mysql的指令连接到这个数据库中,并且通过select * from user(或者db,host)显示每个数据表中的内容。user表中所授予的权限是整个授权机制的基本授权,也就是说,user中的定义对于任何一个用户+主机来说都是适用的,除非在db表中另外有所定义,因此,对于用户来说最好是就某个数据库为基础进行授权。而host表的主要目的是维护一个“安全”服务器的列表。而在具体考虑某个用户/主机对某个数据库的权限的的时候,我们还需要研究一下授权机制的的匹配搜索机制:

其次,在授权机制中可以对一个用户的口令进行加密,而且是必须加密,加密的方法是password('口令'),如果直接填写口令的话,会导致数据库无法访问。user表中所授予的权限是整个授权机制的基本授权,也就是说,user中的定义对于任何一个用户+主机来说都是适用的,除非在db表中另外有所定义,因此,对于用户来说最好是就某个数据库为基础进行授权。而host表的主要目的是维护一个“安全”服务器的列表。而在具体考虑某个用户/主机对某个数据库的权限的的时候,我们还需要研究一下授权机制的的匹配搜索机制:

首先,我们需要介绍一下统配符的概念,统配符包括“%”,其意思为任意(的主机、用户或者数据库),而如果一条记录为空的话,也表示任意的意思。其次,在授权机制中可以对一个用户的口令进行加密,而且是必须加密,加密的方法是password('口令'),如果直接填写口令的话,会导致数据库无法访问。
从我们对这三个表的显示我们可以看到,这三个表中的每一条记录包含了对于某个用户的授权情况的描述,mysql数据库中几个相关的授权机制的数据表被搜索的顺序为:user,db,host。也就是说,我们将首先首先检索user数据表,找到第一个匹配的记录,我们把在user数据表中首先匹配的记录称之为priv;然后搜索db表,获得相应的授权。如果在db数据表相应记录中host字段的为空,并且priv记录中主机也被包含在host表的host字段之中,这样的话,对于某个user来说,则可以在user表中加入在host表中的一些为“y”的权限设定。如果在db表中的host字段不为空的话,那么也就不会对该用户/主机的授权产生什么影响了。
了解了这一点之后,我们需要讨论在各个数据表中的记录的搜索的优先权的问题,也就是说,怎样确定第一匹配的记录,这并不是按照数据表中的记录的自然先后顺序来确定的。在各个数据表内的各条记录的优先权排列如下:
(1)user表:根据先host后user的顺序确定。搜索规则如下:不包含统配符的记录,包含统配符的记录,空记录。而在同样一个host里面,继续按照user来排列,规则和上述的一样。
(2)db表:检索的顺序根据host字段确定:不包含统配符的记录,包含统配符的记录,空记录。
(3)host表:检索的顺序根据host字段确定:不包含统配符的记录,包含统配符的记录,空记录。我们用下面的例子来说明进行匹配搜索的规则:请记住如果你更改了这些数据表,你必须使用mysqladmin reload使其生效。
下面是演示系统是如何进行搜索的:
+-----------+---------+-
| host | user | ...
+-----------+---------+-
| % | root | ...
| % | jeffrey | ...
| localhost | root | ...
| localhost | | ...
+-----------+---------+-
搜索的顺序应当是:
localhost/root
localhost/any
any/jeffrey
any/root
这样,如果在localhost的用户jeffrey要连接数据库的话,那么其授权应当根据localhost/“任意” 行所规定的权限而非“任意”/jeffrey行所规定的权限,请大家注意这一点,因为如果不合适的配置完全可能会使得你无法正常地使用这个数据库系统。
我们现在来看一个添加一个用户的例子:需要添加一名叫做“custom”用户,他分别从主机'localhost', 'server.domain' 和 'whitehouse.gov'连接到数据库中,他的口令为“stupid”,对于数据库'bankaccount'他只想从“localhost”进行访问,而“customer”数据库则应当被上述3个主机所访问。我们通过以下的sql语句来完成其操作。

shell> mysql mysql.
mysql> insert into user (host,user,password)
values('localhost','custom',password('stupid'));
mysql> insert into user (host,user,password)
values('server.domain','custom',password('stupid'));
mysql> insert into user (host,user,password)
values('whitehouse.gov','custom',password('stupid'));

mysql> insert into db
(host,db,user,select_priv,insert_priv,update_priv,delete_priv,
create_priv,drop_priv)
values
('localhost','bankaccount','custom','y','y','y','y','y','y');
mysql> insert into db
(host,db,user,select_priv,insert_priv,update_priv,delete_priv,
create_priv,drop_priv)
values
('%','customers','custom','y','y','y','y','y','y');

3、授权数据表

授权数据表对表的行操作包括select,insert,update和delete,对表和数据库的操作包括create和drop。其它的授权还包括如load data infile和select into outfile和管理命令:shutdown, reload, refresh 和process.三个授权数据表的结构如下所示:
user表
字段 类型 健 默认值
host char(60) pri ""
user char(16) pri ""
password char(16) - ""
select_priv enum('n','y') - n
insert_priv enum('n','y') - n
update_priv enum('n','y') - n
delete_priv enum('n','y') - n
create_priv enum('n','y') - n
drop_priv enum('n','y') - n
reload_priv enum('n','y') - n
shutdown_priv enum('n','y') - n
process_priv enum('n','y') - n
file_priv enum('n','y') - n

db表
字段 类型 健 默认值
host char(60) pri ""
db char(64) pri ""
user char(16) pri ""
select_priv enum('n','y') - n
insert_priv enum('n','y') - n
update_priv enum('n','y') - n
delete_priv enum('n','y') - n
create_priv enum('n','y') - n
drop_priv enum('n','y') - n

host 表只有在db的数据项中出现host为空的情况下使用。
字段 类型 健 默认值
host char(60) pri ""
db char(64) pri ""
select_priv enum('n','y') - n
insert_priv enum('n','y') - n
update_priv enum('n','y') - n
delete_priv enum('n','y') - n
create_priv enum('n','y') - n
drop_priv enum('n','y') - n

在数据表中可以使用统配符号。

4、最常见的access denied出现错误的原因

(1)你是否通过mysql_install_db脚本建立mysql的授权表,你可以通过mysql -u root进行测试,正确的情况下应该不会发生错误。或者,你是否有一个文件为:user.isd,通常其位置在install_dir/var/mysql/user.isd。
(2)最初使用的时候你应该使用mysql -u root mysql以存取数据库,或者以root身份进行操作。
(3)更改了授权之后是否使用了mysqladmin reload进行了更新?
(4)在以测试为目的的时候,你应当选用--without-grant-tables选项启动mysqld服务,你可以在这时更改授权表的相关内容,也可以用mysqlaccess检查你的授权是否到位。
(5)没有使用password("口令")设定了口令,结果也会出现错误,在使用-p的选项的时候,注意-ppassword之间没有空格。

5、如何使得mysql更加安全

(1)为每个mysql用户使用口令。记住,如果你不加设口令的话,其他人可以通过mysql --user other_user database的方式访问你的数据库,在使用mysql进行检测的时候系统也会给你相应的警告信息。
(2)不要用root方式启动mysql服务。mysql可以以任何用户启动。你可以通过添加一个新用户的方式来启动数据库服务。这也不会对系统造成任何影响,因为mysql的用户和unix的用户根本来说就使不同的。
(3)不要把'process_priv','file_priv'等权限授予任何人。
(4)如果你不信任你的dns,你应当使用ip来取代主机名。在任何情况下都要小心带匹佩符的主机名。以下的一些选项可以影响到你的系统的安全
--secure
顾名思义,可以使系统根加安全,因为它可以检查ip地址的一致性。(实际连接ip地址和通过解析的ip地址),不过这使得mysql在防火墙工作的时候很难被防火墙外的人所访问。
--skip-grant-tables
一般情况下不要使用这个选项,这可以试的任何人不受限制地访问你的系统。
--skip-name-resolve
不进行主机名的解析。在授权数据表中的所有主机名必须为ip地址或者'localhost'.
--skip-networking
不允许通过网络进行连接。所有的连接必须通过unix socket。



编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:在存储过程中使用use database
下一篇:哪些数据库是免费的?
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
jsp+mysql+java类优化分页 jbuilderx+sql server开发hibernate visual c#的sql server编程
visual c#的sql server编程 用perl访问mysql数据库之一 用perl访问mysql数据库之二
asp.net连sql7接口源代码  一个用wsh来控制sqlserver的dcom的vbs .net下调用sqlserver2k中存储过程
用asp.net还原与恢复sqlserver数据库 asp.net中如何防范sql注入式攻击 .net和sql server中“空值”辨析
asp.net2.0+sql server2005构建多层应用 如何在jsp中使用jdbc来联结mysql j2ee的jdbc配置指南--连接sql server 数
jsp连接sql server问题总结 jsp数据库操作例程 - 存储过程 - jdbc- jsp连接sql server 2000系统配置
tomcat5+mssql server 2000数据库连接池 win2000+php+mysql+tomcat+jsp完全整合 安装resin+mysql+iis+jdk的总结
配置整合win+apache+php+mysql+tcomcat windows2000下整合mysql4.0.13与tomcat java/jsp学习系列之六(mysql翻页例子)
最新更新 热点排行 推荐新闻
exeplorer.exe错误的问题的总结、解决
哪些数据库是免费的?                
如何实现mysql中的用户管理?         
在存储过程中使用use database       
怎样在vc、delphi中使用mysql(mysql o
快速安装windows操作系统独家秘籍
30秒清除windows系统所有垃圾
系统盘符错乱的解决方案
由windows远程桌面想到的复制粘贴问题
不输密码照样登陆操作系统
完美解决一个事件激活多个函数(2)
初学javascript之cookie篇(译)
javascript对象与数组参考大全
用javascript 实现的dual listbox
javascript版的日期输入控件
qq密码被盗怎么办!我教你找回密码
winrar将推出免费正版序列号!
轻易破解winrar,winzip密码
备份软件ghost使用教程
xp中重新安装或修复ie6的三种方法
让winrar汗颜的压缩软件uharc
ghost批处理命令用法详解
qb这样拿!免费获取qb方法剖析
如何控制我的电脑只允许登录我自己的q
qq2006 beta3隆重发布 实用功能一一奉
exeplorer.exe错误的问题的总结、解决
快速安装windows操作系统独家秘籍
30秒清除windows系统所有垃圾
系统盘符错乱的解决方案
由windows远程桌面想到的复制粘贴问题
不输密码照样登陆操作系统
windows下的虚拟主机设置全功略
windows操作系统完美维护技巧
ghost备份问题精彩解决方法集锦
菜鸟学电脑之端口基础知识
qq号码激活的常见问题及案例分析 
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights © 2004-2006 iyit.net all rights reserved.
网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息