回顾:
1.Mysql认证方式:
root@localhost(登录主机的地址-客户端) 密码
客户端:
要通过什么用户什么密码登录服务器
用户名 密码 登录的服务器的IP地址 服务器提供的mysql服务的端口
服务端:
验证客户端的登录信息是否在我的用户表里(用户名、密码、客户端的登录主机)
访问mysql的user表(涉及到客户端连接)
desc mysql.user;
select host,user,authentication_string from mysql.user;
2.mysql默认的用户
1.‘mysql.sys’@‘localhost’:避免DBA重命名或者删除root用户时发生的问题。该用户已经被锁定,客户端无法连接
2.‘mysql.session’@‘localhost’:插件内部使用来访问服务器,该用户已经被锁定,客户端无法连接
3.‘root’@‘localhost’:用于管理,该用户拥有所有权限,可执行任何操作
权限
Mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,存储账户权限信息表主要有:user、db、tables_priv、columns_priv、 procs_priv、proxies_priv
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user_specification
TO user_specification
解释:
priv_level: {
* (当前数据库)
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
grant 权限操作分类 on 数据库作用范围权限分类(1、2、3) to 某个用户
数据库作用范围权限分类
1.全局权限(global privileges):作用在提供mysql服务的实例下的所有数据库
授予全局权限:on *.*
记录到mysql.user表
2.数据库权限(database privileges):作用在某些特定数据库,拥有特定数据库下的所有权限
db_name.*:拥有db_name数据库下的所有表的权限
记录到mysql.db表中
3.表权限(table privileges):作用在特定的表上
db_name.table_name
记录到mysql.tables_priv表中
权限操作分类:用,分隔
4.列权限(column privileges):作用在特定表的特定列
在权限操作分类里体现列权限 select(col_name)
举例:u3用户可以访问test数据库t3(name)列
grant all(name) on table test.t3 to 'u3'@'localhost';
记录到mysql.columns_priv表中 field:列的含义
5.存储过程权限(stored routine privileges):作用在存储过程和函数
记录到mysql.procs_priv procedure
6.代理用户权限(proxy user privileges):使一个用户成为另一个用户的代理
记录到mysql.proxies_priv表中 proxy
show privileges;显示结果---(权限操作分类)
all(谨慎,包含管理数据库的权限) 授予某个级别特定的所有权限,除了grant option权限:表示自己有的权限授权给别人
alter 允许使用alter table语句 级别:global、database、table(1、2、3)
alter routine 允许修改或删除存储例程 级别:global、database、table(1、2、3)
create 允许创建数据库和表
create tablespace 允许创建、修改、删除表空间和日志文件组 级别:global
create temporary tablespace 允许创建临时表 级别:global、database
create user 允许使用create user、drop user、rename user、revoke all privileges语句 级别:global
create viwe 允许创建和修改视图
shutdown 允许使用mysqldmin shutdown 级别:global
delete 允许删除表中的行
drop 允许删除数据库、表、视图
event 允许使用事件 mysql的时间调度-linux下的crontab
execute 允许用户执行存储过程
file 允许用户使用load data infile读写文件 级别:global
grant option 允许把自己有的权限授权给其他用户或者从其他用户那里废除 级别:global、database、table、procedure、proxy
index 允许创建或删除索引
insert 允许向表中插入行
lock tables 允许使用lock tables语句 级别:global、database
process 允许使用show processlist语句查看正在运行的进程 级别:global
proxy 允许用户代理 级别
references 允许使用外键 级别:global、database、table、column
reload 允许使用flush语句 级别:global
select 允许查询表 级别:global、database、table、column
show databases 允许使用show databases语句 级别:global
show view 允许使用show create view语句 级别:global
super 允许使用其他管理语句
trigger 允许触发器操作
update 允许更新表中的行 级别:global、database、table、column
usage "no privileges"的同义词
给用户授权
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user_specification [, user_specification] ...
选项:(1.当用户不存在时,会创建用户。不加此选项,会报错--可以通过修改‘sql_mode’参数来实现 2,,当用户存在的时候,会修改密码)
user_specification:
user [ auth_option ]
auth_option: { # Before MySQL 5.7.6
IDENTIFIED BY 'auth_string'
| IDENTIFIED BY PASSWORD 'hash_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin AS 'hash_string'
}
1.授予表权限
如果被授权的用户不存在,那么grant语句会自动创建新的账户,除非设置参数sql_mode包含“NO_AUTO_CREATE_USER” 。从5.7.7版本开始,默认的sql_mode就包含“NO_AUTO_CREATE_USER” (grant语句不再创建新的账户)
示例:赋予用户‘aaa’@'localhost’对于test数据库下的a表所有权限
第一个SQL语言不成功,因为用户不存在
第二个SQL语言创建成功,加了identified by相当于新创建了这个用户
但是对于第二个SQL语句会有警告–用grant创建新用户已经被废弃了,并且将会在之后的版本中移除,创建新用户用create user
2.授予列权限
举例9:授予用户bob可以对test.a表的id和name列进行更新
grant update(id,name) on test.a to ‘bob’@‘localhost’;
3.授予数据库权限
举例10:授予用户bob可以对test数据库中的所有表进行查询
grant select on test.* to bob;
举例11:授予jim在test数据库中创建、修改、删除表的权限以及创建视图的权限
grant create、alter、drop、create view on test.* to jim;
举例12:授予jim可以对当前数据库中的所有表进行查询
grant select on * to jim; *----表示当前数据库
举例13:授予jim可以创建、修改、删除数据库以及对所有数据库中的所有表进行create、alter和drop
grant create,alter,drop on . to jim;
举例14:授予jim可以创建新用户
grant create user on . to jim;
举例15:授予newroot1具有和root@localhost一样的权限
grant all on . to ‘newroot1’@‘localhost’ with grant option;
all权限没有给别人赋权的权限,因此要在最后加with grant option
举例16:查看自己的权限:
show grants;
权限的传递
with grant option子句:通过在grant语句的最后使用该子句,就允许被授权的用户把得到的权限继续授给其它用户
示例17:授予jim对teams表具有references权限,并允许他把权限授给其它用户
grant references on teams to jim with grant option;
废除权限
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user_specification [, user_specification] ...
废除用户在所有级别上的权限
revoke all,grant option from user[,user]....
示例18:废除jim对teams表的references权限
revoke references on teams from jim;
示例20:要废除jim得到的with grant权限
revoke grant option on test.ceshi from jim;
权限检查顺序
mysql数据库(系统数据库)下的表user、db、tables_priv、columns_priv、proce_priv、proxies_priv共同构成授权表
开始查询
1.校验user表,对于全局权限是ok—直接执行
2.检验DB表,对于某个有特定的数据库有权限—执行
3.检验tables_priv,对于特定数据库下的某些表是有权限—执行
4.检验columns_priv,对于特定表中的某些列有权限—执行