mysql用户权限管理
mysql用户权限管理和平常系统不一样,平常系统给张三分配权限后,不管张三在哪里登录,他的权限都是一样的。
但是在mysql中一个用户可以有多个密码,用户在a网段登录用一个密码,在b网段登录用另一个密码;可以这样理解在mysql中
登录名+登录网址=平常系统的登录名。mysql中一个用户的登录网址不同分配权限也可以不同。
mysql数据库中的4个权限表:user 、db、 tables_priv、columns_priv。
用户权限验证和分配的过程:
1)先从user表中的host、 user、 password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证;
2)通过权限验证,进行权限分配时,按照user db tables_priv columns_priv的顺序进行分配。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
通过可以查看有哪些权限:
show COLUMNS from user;
show COLUMNS from db;
show COLUMNS from tables_priv;
show COLUMNS from columns_priv;
用户授权
mysql> grant all privileges on *.* to 'yangxin'@'%' identified by 'yangxin123456' with grant option;
1、all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
2、on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user
3、to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:”yangxin”@”192.168.0.%”,表示yangxin这个用户只能在192.168.0IP段登录
4、identified by:非必须,修改用户的登录密码。
5、with grant option:非必须,表示允许用户将自己的权限授权给其它用户。
查看权限
mysql> grant select,create,drop,update,alter on *.* to 'yangxin'@'localhost' identified by 'yangxin0917' with grant option;
回收权限
删除yangxin这个用户的create权限,该用户将不能创建数据库和表。
mysql> revoke create on *.* from '[email protected]';
刷新权限
对用户做了权限变更之后,一定记得重新加载一下权限。
mysql> flush privileges;
实例一:
1、创建四个BOB用户。mysql数据库地址:106.12.5.23
create user 'BOB'@'localhost' identified by '123'; //只能在mysql本地登录mysql数据库
create user 'BOB'@'101.80.167.133' identified by '1234';//只能在101.80.167.133机子上登录mysql数据库
create user 'BOB'@'101.80.167.%' identified by '12345';
create user 'BOB' identified by '123456';//'BOB'后没有@,相当于'BOB'@'%' 。
select * from user;
2、创建一个数据库并添加一张表
create database bob_database;
use bob_database;
create table user_account
(
id int,
login_name varchar(200),
password varchar(200)
);
3、给四个BOB用户受权:
#将所有库的所有权限受于'BOB'@'localhost'
grant all privileges on *.* to 'BOB'@'localhost';
#将bob_database库的所有权限受于'BOB'@'101.80.167.133'
grant all privileges on bob_database.* to 'BOB'@'101.80.167.133';
#将bob_database库user_account表的select、insert权限受于'BOB'@'101.80.167.%'
grant select, insert on bob_database.user_account to 'BOB'@'101.80.167.%';
#将bob_database库user_account表的select(id,login_name)权限受于'BOB'@'101.80.167.%'
grant select (id, login_name) on bob_database.user_account to 'BOB'@'%';
#刷新权限
flush privileges;
4、查看user 、db、 tables_priv、columns_priv这四个权限表的变化
select * from user;
Select * from db;
select * from tables_priv;
select * from columns_priv;
5、测试
在mysql本地登录,只有密码为123才能成功