背景
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用。如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接。在稍微大一点的公司里面都是进行着明显的权限管理。特别是操作数据库这样重要的东西,万一你要是一不小心删库了,就麻烦了,因为root的权限太多(增删改查权限都有),一不小心就会给公司造成很大损失。所以在公司里面一般一个项目都会创建一个专门的用户,指定其权限只能控制某一个数据库进行操作。
一、创建新用户
用户被创建后,包括密码、权限和资源限制等信息都会被存储在一个名为mysql数据库中的名为user的表中。
命令:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
说明:
username:你将新建的用户名
host:指定该用户可以在哪个主机上登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%.
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.
例子:
CREATE USER 'hejie'@'localhost' IDENTIFIED BY '123456'; //只能在本地计算机(127.0.0.1)上访问
CREATE USER 'hejie'@'192.168.1.101' IDENDIFIED BY '123456'; //只能在该IP下才能访问
CREATE USER 'hejie'@'192.168.1.%' IDENTIFIED BY '123456'; //只能在该IP段内才能访问
CREATE USER 'hejie'@'%' IDENTIFIED BY ''; //可以在任意IP下访问,允许外网访问,并且不用输入密码
drop user '用户名'@'IP地址';
例子:
drop user 'hejie'@'localhost';
rename user '用户名'@'IP地址' to '新用户名'@'IP地址';
set password for '用户名'@'IP地址' = Password('新密码');
select User,Host FROM mysql.user;
select current_user();或者select user();
二、授予权限
mysql的权限就是允许做你权利以内的事情,不可以越界。比如只允许select操作,就不能执行update操作。只允许你从某台机器上连接mysql,那么你就不能从其他机器连接mysql。
mysql权限的实现分为两个阶段验证:
第一阶段:服务器首先会检查你是否允许连接。因为创建用户的时候会加上主机限制,可以限制成本地、某个IP、某个IP段、以及任何地方等,只允许你从配置的指定地方登陆。
第二阶段:如果你能连接,Mysql会检查你发出的每个请求,看你是否有足够的权限实施它。比如你要更新某个表、或者查询某个表,Mysql会查看你对那个表或者那个列是否有权限。再比如,你要运行某个存储过程,Mysql会检查你对存储过程是否有执行权限等。
对root用户和普通用户都可以进行权限操作。。。。所有权限的操作必须在root用户下进行,在普通用户下无法进行授权和删除权限操作,但可以执行查询权限操作
命令: grant 权限 on 数据库.表 to '用户'@'IP地址';
grant privileges ON databasename.tablename TO 'username'@'ip地址'
说明:
privileges:用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*
例子:
GRANT SELECT, INSERT ON practice.user1 TO 'hejie'@'localhost'; //对practice数据库的user1表仅有select和insert权限
GRANT ALL ON *.* TO 'hejie'@'localhost'; //对所有数据库的所有表有所有操作权限,all等同于all privileges
注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
GRANT privileges ON databasename.tablename TO 'username'@'ip地址' WITH GRANT OPTION;
使用这个命令使权限生效,尤其是你对那些权限做了update或者delete更新的时候。以前遇到过使用grant后权限没有更新的情况,只要对权限做了更改就使用flush privileges命令来刷新权限
flush privileges;
show grants for '用户'@'IP地址'
revoke 权限 on 数据库.表 from '用户'@'IP地址';
权限 | 说明 | 举例 |
---|---|---|
usage | 连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。该权限只能用于数据库登陆,不能执行任何操作;且usage权限不能被回收,也即revoke用户并不能删除usage权限。 | grant usage on . to 'hejie′@‘localhost’ identified by ‘123456’; |
select | 必须有select的权限,才能执行select操作 | grant select on * .* to 'hejie′@‘localhost’; |
insert | 必须有insert的权限,才可以使用insert into …… values…. | grant insert on pyt.* to 'root′@‘localhost’; insert into shop(name) values(‘aa’); |
update | 必须有update的权限,才可以使用update table | update shop set price=3.5 where article=0001 and dealer=‘A’; |
delete | 必须有delete的权限,才可以使用delete from ….where….(删除表中的记录) | grant delete on pyt.* to 'root′@‘localhost’;delete from table where id=1; |
alter | 必须有alter的权限,才可以使用alter table | alter table shop modify dealer char(15); |
alter routine | 必须具有alter routine的权限,才可以使用{alter drop} {procedure/function} | grant alter routine on pyt.* to ‘root′@’ localhost '; |
create | 必须具有create routine的权限,才可以使用{create/alter/drop} {procedure/function} | grant create on pyt.* to 'root′@‘localhost’; |
create temporary tables | 必须有create temporary tables的权限,才可以使用create temporary tables.(注意这里是tables,不是table) | grant create temporary tables on pyt.* to 'root′@‘localhost’; |
create view | 必须有create view的权限,才可以使用create view | grant create view on pyt.* to 'root′@‘localhost’; |
create user | 要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。 | grant create user on * .* to 'root′@‘localhost’; |
drop | 必须有drop的权限,才可以删除库、表、索引、视图等 | drop database db_name; drop table tab_name;drop view vi_name;drop index in_name; |
show database | 通过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。对于root@localhost用户来说,没有对mysql数据库的权限,所以以此身份登陆查询时,无法看到mysql数据库 | show databases; |
show view | 必须拥有show view权限,才能执行show create view | show create view name; |
index | 必须拥有index权限,才能执行[create/drop] index | grant index on pyt.* to root@localhost;create index ix_shop on shop(article);drop index ix_shop on shop; |
excute | 执行存在的Functions,Procedures | call pro_shoroot(0001,@a); |
event | event的使用频率较低建议使用root用户进行创建和维护。要使event起作用,MySQL的常量GLOBAL event_scheduler必须为on或者是1 | show global variables like ‘event_scheduler’; |
lock tables | 必须拥有lock tables权限,才可以使用lock tables | grant lock tables on pyt.* to root@localhost;lock tables a1 read;unlock tables; |
references | 有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。 | |
reload | 必须拥有reload权限,才可以执行flush [tables / logs / privileges] | grant reload on * .* to 'root′@‘localhost’; |
replication client | 拥有此权限可以查询master server、slave server状态。 | grant Replication client on . to root@localhost;或grant super on . to root@localhost; show master status; |
replication slave | 拥有此权限可以查看从服务器,从主服务器读取二进制日志。 | grant replication slave on . to root@localhost;show slave hosts;show binlog events; |
Shutdown | 关闭mysql权限 | $ mysqladmin shutdown |
grant option | 拥有grant option,就可以将自己拥有的权限授予其他用户(仅限于自己已经拥有的权限) | grant Grant option on pyt.* to root@localhost;grant select on pyt.* to p2@localhost; |
process | 通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。 | show processlist; |
file | 拥有file权限才可以执行 select …into outfile和load data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患 | grant file on . to root@localhost;grant file on . to root@localhost; |
super | 这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。 | grant super on . to root@localhost;purge master logs before 'mysql-bin.000006′; |
all privileges | 所有权限。with grant option 可以连带授权 | grant all privileges on pyt.* to root@localhost with grant option; |
revoke用户hejie的select权限后,查询权限,发现已经没有了select权限
下图表示没有select权限,无法进行查询