MySQL 用户名和口令
* MySQL使用于认证目的的用户名与Unix用户名(登录名字)或Windows用户名无关缺省地大多数MySQL客户尝试使用当前Unix用户名作为MySQL用户名登录但是这仅仅为了方便客户程序允许用u或user选项指定一个不同的名字及与安全的考虑所有的MySQL用户名都应该有口令
* MySQL用户名最长可以是各字符典型地Unix用户名限制为个字符
* MySQL口令与Unix口令没关系
* MySQL加密口令使用了一个Unix登录期间所用的不同算法PASSWORD()和ENCRYPT()
函数PASSWORD(str)
从纯文本口令str计算一个口令字符串该函数被用于为了在user授权表的Password列中存储口令而加密MySQL口令
mysql> select PASSWORD(badpwd);
> fddb
PASSWORD()加密是非可逆的PASSWORD()不以与Unix口令加密的相同的方法执行口令加密你不应该假定如果你的Unix 口令和你的MySQL口令是一样的PASSWORD()将导致与在Unix口令文件存储的相同的加密值见ENCRYPT()
ENCRYPT(str[salt])
使用Unix crypt()系统调用加密strsalt参数应该是一个有个字符的字符串(MySQL 中salt可以长于个字符)
mysql> select ENCRYPT(hello);
> VxuFAJXVARROc
如果crypt()在你的系统上不可用ENCRYPT()总是返回NULLENCRYPT()只保留str起始个字符而忽略所有其他至少在某些系统上是这样这将由底层的crypt()系统调用的行为决定
与MySQL服务器连接
语法格式
shell> mysql [h host_name][u user_name][pyour_pass ]
h u和p选项的另一种形式是host=host_nameuser=user_name和password=your_pass
注意在p或password=与跟随它后面的口令之间没有空格(在命令行上指定一个口令是不安全的!)
对于命令行没有的联接参数mysql使用缺省值
* 缺省主机名是localhost
* 缺省用户名是你的Unix登录名
* 如果没有p则没有提供口令
缺省值参数的指定
在你的主目录下f的配置文件的[client]小节里指定连接参数
[client]
host=host_name
user=user_name
password=your_pass
注命令行上被指定的值优先于在配置文件和环境变量中指定的值
最安全的方法是让客户程序提示口令或在一个适当保护的f文件中指定口令
MySQL提供的权限
权限列上下文
select Select_priv 表
insert Insert_priv 表
update Update_priv 表
delete Delete_priv 表
index Index_priv 表
alter Alter_priv 表
create Create_priv 数据库表或索引
drop Drop_priv 数据库或表
grant Grant_priv 数据库或表
references References_priv 数据库或表
reload Reload_priv 服务器管理
shutdown Shutdown_priv 服务器管理
process Process_priv 服务器管理
file File_priv 在服务器上的文件存取
注grant权限允许你把你自己拥有的那些权限授给其他的用户
file权限给予你用LOAD DATA INFILE和SELECT INTO OUTFILE语句读和写服务器上的文件任何被授予这个权限的用户都能读或写MySQL服务器能读或写的任何文件
存取控制连接证实
身份检查使用user表个(Host User和Password)范围字段服务器只有在一个user表条目匹配你的主机名和用户名并且你提供了正确的口令时才接受连接
注一个Host值可以是主机名或一个IP数字或localhost指出本地主机 可以在Host字段里使用通配符字符%和_ Host值%匹配任何主机名当一个连接被尝试时服务器浏览排序的条目并使用找到的第一个匹配
普遍的误解是认为对一个给定的用户名当服务器试图对连接寻找匹配时明确命名那个用户的所有条目将首先被使用这明显不是事实
存取控制请求证实
一旦你建立了一个连接服务器进入阶段对在此连接上进来的每个请求服务器检查你是否有足够的权限来执行它授权表用GRANT和REVOKE命令操作
GRANT priv_type [(column_list)] [ priv_type [(column_list)] ]
ON {tbl_name | * | ** | db_name*}
TO user_name [IDENTIFIED BY password]
[ user_name [IDENTIFIED BY password] ]
[WITH GRANT OPTION]
REVOKE priv_type [(column_list)] [ priv_type [(column_list)] ]
ON {tbl_name | * | ** | db_name*}
FROM user_name [ user_name ]
GRANT在MySQL 或以后版本中实现对于更早MySQL版本GRANT语句不做任何事情
GRANT和REVOKE命令允许系统主管在个权限级别上授权和撤回赋予MySQL用户的权利
全局级别
全局权限作用于一个给定服务器上的所有数据库这些权限存储在mysqluser表中
数据库级别
数据库权限作用于一个给定数据库的所有表这些权限存储在mysqldb和mysqlhost表中
表级别
表权限作用于一个给定表的所有列这些权限存储在mysqltables_priv表中
列级别
列权限作用于在一个给定表的单个列这些权限存储在lumns_priv表中
user表权限是超级用户权限只把user表的权限授予超级用户如服务器或数据库主管是明智的对其他用户你应该把在user表中的权限设成N并且仅在一个特定数据库的基础上授权 使用db和host表
权限更改何时生效
当mysqld启动时所有的授权表内容被读进存储器并且从那点生效
用GRANTREVOKE或SET PASSWORD对授权表施行的修改会立即被服务器注意到
如果你手工地修改授权表(使用INSERTUPDATE等等)你应该执行一个FLUSH PRIVILEGES语句或运行mysqladmin flushprivileges告诉服务器再装载授权表否则你的改变将不生效除非你重启服务器
建立初始的MySQL权限
在安装MySQL后你通过运行scripts/mysql_install_db安装初始的存取权限包含下列权限集合
* MySQL root用户作为可做任何事情的一个超级用户连接必须由本地主机发出注意出世的root口令是空的因此任何人能以root而没有一个口令进行连接并且被授予所有权限
* 一个匿名用户他可对有一个test或以test_开始的名字的数据库做任何时期事情连接必须由本地主机发出这意味着任何本地用户能连接并且视为匿名用户
* 其他权限被拒绝例如一般用户不能使用mysqladmin shutdown或mysqladmin processlist
为MySQL root用户指定一个口令(注意你使用PASSWORD()函数指定口令)
shell> mysql u root mysql
mysql> UPDATE user SET Password=PASSWORD(new_password)
WHERE user=root;
mysql> FLUSH PRIVILEGES;
在MySQL 和以上版本中你可以使用SET PASSWORD语句
shell> mysql u root mysql
mysql> SET PASSWORD FOR root=PASSWORD(new_password);
设置口令的另一种方法是使用mysqladmin命令
shell> mysqladmin u root password new_password
看看scripts/mysql_install_db脚本看它如何安装缺省的权限你可用它作为一个研究如何增加其他用户的基础
为了完全重建权限表删除在包含mysql数据库的目录下所有*frm*MYI和*MYD文件(这是在数据库目录下面命名为mysql的目录当你运行mysqld help时它被列出)然后运行mysql_install_db脚本可能在首先编辑它拥有你想要的权限之后
向MySQL增加新用户权限
增加用户个不同的方法
通过使用GRANT语句或通过直接操作MySQL授权表
比较好的方法是使用GRANT语句因为他们是更简明并且好像错误少些
shell> mysql user=root mysql
mysql> GRANT ALL PRIVILEGES ON ** TO monty@localhost
IDENTIFIED BY something WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON ** TO monty@%
IDENTIFIED BY something WITH GRANT OPTION;
mysql> GRANT RELOADPROCESS ON ** TO admin@localhost;
mysql> GRANT USAGE ON ** TO dummy@localhost;
monty
可以从任何地方连接服务器的一个完全的超级用户但是必须使用一个口令(something做这个注意我们必须对monty@localhost和monty@%发出GRANT语句如果我们增加localhost条目对localhost的匿名用户条目在我们从本地主机连接接时由mysql_install_db创建的条目将优先考虑因为它有更特定的Host字段值所以以user表排列顺序看更早到来
admin
可以从localhost没有一个口令进行连接并且被授予reload和process管理权限的用户这允许用户执行mysqladmin reloadmysqladmin refresh和mysqladmin flush*命令还有mysqladmin processlist没有授予数据库有关的权限他们能在以后通过发出另一个GRANT语句授权
dummy
可以不用一个口令连接的一个用户但是只能从本地主机全局权限被设置为NUSAGE权限类型允许你无需权限就可设置一个用户它假定你将在以后授予数据库相关的权限
也可以直接通过发出INSERT语句增加同样的用户存取信息然后告诉服务器再次装入授权表
shell> mysql user=root mysql
mysql> INSERT INTO user VALUES(localhostmontyPASSWORD(something)
YYY