mysql权限系统简介
mysql的权限相关信息主要存储在几个被称为grant tables的系统表中,即mysql.user,mysql.db,mysql.host,mysql.table_priv和mysql.column_priv。
权限信息数据量小,且访问频繁,所以每次启动mysql时,都会将所有权限信息都加载到内存中,并保存在几个特定的结构里。所有每次手动修改了相关权限表之后,都需要执行“flush privileges”命令。
使用grant命令,revoke命令,creater user命令,drop user命令修改用户相关权限时,在修改grant tables的同时,也会修改内存中的权限信息。
尽量使用grant,revoke,creater user,drop user等命令。
用户管理
creater user 命令创建用户
创建用户首先必须拥有mysql数据库的全局create user 权限,或insert权限。对于每个账户,create user会在没有权限的mysql.user表中创建一条记录。若账户不存在,则出现错误。使用自选的identified by子句设置用户密码。
该命令创建的用户无任何特别权限,仅拥有初始usage权限。
create user user [idenhtity by [password ‘password’]][, user [idenhtity by [password ‘password’]]]
drop user命令删除用户
闲置账户应该被删除。drop user 不能自动关闭任何打开的用户对话;而且,若用户有打开的对话,此时取消用户,则命令不会生效,直到用户对话被关闭后才生效。一旦对话被关闭,用户也被取消,此用户再次登录时将失败。
drop user user[,user]...
rename user 重命名用户
当旧账户不存在或新账户已存在,则会出现错误。
rename user old_user to new_user[ ,old_user to new_user]...
权限管理
要为某个用户授权使用grant命令,要去除某个用户的权限使用revoke命令。还有一种暴力的方法即直接更新grant tables系统表。
当给某个用户授权时,需要指定用户名与主机。格式:’username’@’hostname’。授权时,若仅指定用户名,则mysql会自动认为是对’username’@’% ’授权。要去除某个用户的权限,也需要指定主机。
查看某个用户的权限
方法一:
show grants for ’username’@’hostname’
方法二:
查询grant tables的权限信息。
grant和revoke命令
grant和revoke命令用来管理访问权限,也可以用来创建和删除用户,但在mysql5.0.2可以利用greate user和drop user命令更容易实现。
grant和revoke命令对于谁可以操作服务器及其内容的各个方面提供了多程度的控制,从谁可以关闭服务器,到谁可以修改特定表字段中的信息都能控制。
普通用户的权限权限应用于描述
select表,列允许用户从表中选择行(记录)
insert表,列允许用户在表中插入新行
update表,列允许用户修改现存表里行中的值
delete表允许用户删除现存表的行
index表允许用户创建和拖动特定表索引
alter表允许用户改变现存表的结构。例如,可添加列、重命名列或表、修改列的数据类型
create数据库,表允许用户创建新数据库或表。如果在grant中指定了一个特定的数据库或表,他们只能够创建该数据库或表,即他们必须首先删除(drop)它
drop数据库,表允许用户拖动(删除)数据库或表
管理员权限权限描述
create temporary tables允许管理员在create table语句中使用temporary关键字
file允许将数据从文件读入表,或从表读入文件
lock tables允许使用lock tables语句
process允许管理员查看属于所有用户的服务器进程
reload允许管理员重新载入授权表、清空授权、主机、日志和表格
replication client允许在复制主机(master)和从机(slave)上使用show status
replication slave允许复制从服务器连接到主服务器
show databases允许使用show databases语句查看所有的数据库列表。没有这个权限,用户只能看到他们能够看到的数据库
shutdown允许管理员关闭mysql服务器
super允许管理员关闭属于任何用户的线程
特别的权限权限描述
all(或all previleges)授予所有权限
usage不授予权限。这将创建一个用户并允许他登录,但不允许其他操作,如update/select 等。
授权层级
mysql中的权限分为5个级别:
全局层级(global level)
数据库层级(databases level)
表层级(table level)
列层级(column level)
子程序层级(routine level)
权限生效
mysql数据库服务器启动时,以及使用grant与revoke语句的时,服务器会自动读取grant表。同时,可以手动修改它们。
当手动更新它们时,mysql服务器将不会注意到他们已经被修改了。必须向服务器指出已经对权限进行修改,有3种方法可以实现这个任务。可以在mysql命令提示符下(必须以管理员身份进入)键入命令:
flush privileges;
或者在shell环境下使用
mysqladmin flush-privileges
或
mysqladmin reload
此后当数据库再次连接的时候,系统将检查全局级别权限;当下一条命令被执行时,将检查数据库级别的权限;而表级别和列级别权限权限将在用户下次请求的时候被检查。
设置账户密码
可以用mysqladmin命令指定密码:
mysqladmin -u user_name -h host_name password “newpwd”
mysqladmin重设服务器host_name,且用户名为user_name用户的密码,新密码为“newpwd”。
set password命令设置用户密码:
只有特定用户(可以更新mysql数据库的用户,如root)身份登录,才可以修改其他用户密码。
set password for‘jeffrey’@’%’=password(‘biscuit’);
若不以匿名用户连接,则可以省略for子句而修改自己的密码:
set password =password(‘biscuit’);
在全局级别下使用grant usage语句(在*.*)指定某个账户的密码,而不影响账户当前权限:
grant usage on *.* to ‘jeffrey’@’%’ identified by ’biscuit’;
在创建新账户时建立密码,要为password列提供一个具体值:
mysql -u root mysql
insert into user(host,user,password) values (‘%’,’jeffrey’,password(‘biscuit’’));
flush privileges;
更改已有账户的密码,要应用update语句来设置password列值。
mysql -u root mysql
update user set password =password(‘bagel’) where host = ‘%’ and user =’francis’;
flush privileges;
设置密码时,使用set password,insert,update设定密码,使用password()函数对密码进行加密。
若使用grant..identified by语句或mysqladmin password命令设置密码,这些命令会对密码自动加密,不需要使用password()函数。
注意安全
在管理级别,一定不能将mysql.user表的访问权限授予任何非管理账户。
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。laplacedemon/sjq
