1、权限表
存储用户权限信息表主要有:user、db、host、tables_priv、columns_priv、procs_priv。
1》user表:
记录允许连接到服务器的账号信息,里面的权限是全局级别的。user表有42个字段,这些字段可以分为4类,分别是用户列、权限列、安全列、资源控制列。
2》db和host表
3》tables_priv和columns_priv表
4》procs_priv表
2、账户管理
1》登录和登出MySQL
mysql [-h localhost] -uroot -p12345 -P端口号,默认3306 -e命令或SQL语句
2》新建普通用户
1>create user或grant语句:
//create user ...
create user user_specification[,user_specification] ... user_specification: user@host [ identified by [password] 'password' |identified with auth_plugin [as 'auth_string'] ] user:表示创建的用户名称 host:表示允许登录的用户主机名 identified by:表示用来设置用户的密码。与identitied with互斥。 [password]:表示使用hash值设置密码 'password':表示登录时使用的普通明文密码 identified with:为用户指定一个身份验证插件。与identified by互斥。 auth_plugin:插件的名称 auth_string:该参数传值给身份验证插件,由该插件解析该参数的意义
举例:create user 'lfy'@'localhost' identified by '12345';
或者
create user 'lfy'@'localhost';
//grant语句不仅可以创建用户,还可以在创建用户的同时授权 grant privileges on db.table to user@host [identified by 'password'] [,user [identified by 'password']]
[with grant option];
privileges:表示赋予用户的权限类型
db.table:表示用户的权限所作用的数据库中的表
identified by:设置的密码
[with grant option]:表示对新建立的用户赋予grant权限,即该用户可以对其他用户赋予权限。
grant select,update on *.* to 'lfy'@'localhost' identified by '12345';
user、host字段区分大小写。查询的时候需要指定正确的值。
2>直接操作MySQL授权表:
insert into MySQL.user(user,host,password,[privilegelist]) values(...)
3》删除普通用户,2种方式。
1>drop user语句
drop user user1 [,user2];
2>delete删除用户
delete from MySQL.user where host='hostname' and user='username';
4》root用户修改自己的密码
1>mysqladmin命令
mysqladmin -u username -h localhost -p password 'newpwd';
2>修改MySQL.user表
update MySQL.user set password=password("rootpwd") where user="root" and host="localhost";
执行完上面的语句修改密码后,还需要执行:
mysql>FLUSH PRIVILEGES; //重新加载权限
3>使用set语句修改root用户的密码
//可以修改别的用户的密码,也可以修改自己的密码 mysql>set password=password("rootpwd"); mysql>FLUSH PRIVILEGES;
5》root用户修改普通用户的密码:set数据库的MySQL.user表,或者grant语句
1>使用set语句修改普通用户的密码
set password for 'user'@'host' = password('somepassword'); //普通用户更改自己的密码 set password=password('somepassword');
2>使用update语句修改普通用户的密码
update MySQL.user set password=password('pwd') where user='username' and host='hostname';
PLUSH PRIVILEGES;
3>使用grant语句修改普通用户密码
grant urant on *.* to 'user'@'%' identified by 'somepassword';
//全局界别使用grant usage语句(*.*)指定某个账户的密码而不影响账户当前的权限。
使用grant ... identified by语句或者MySQLadmin password命令设置密码,它们俊辉加密密码。这种情况下,
不需要使用password()函数
6》普通用户修改密码
set password = password('pwd');
7》root用户密码丢失
1>使用--skip-grant-tables选项启动MySQL服务
使用使用--skip-grant-tables选项启动MySQL服务,MySQL数据库服务器将不加载权限判断,任何用户都能访问数据库。Windows操作系统中,可以使用MySQLLd或MySQLLd-nt来启动MySQL服务进程。
mysqld --skip-grant-tables
或者
mysqld-nt --skip-grant-tables
2>使用root用户登录,重新设置密码。
3、权限管理
1》MySQL的各种权限
2》授权
1>全局层级:全局权限适用于一个给定服务器中的所有数据库。这些权限存储在MySQL.user表中。grant all on *.*和revoke all on *.*只授予和撤销全局权限。
2>数据库层级
数据库权限适用于一个给定数据库中的所有目标。这些权限存储在MySQL.db和MySQL.host表中。grant all on db_name.和revoke all on db_name.*只授予和撤销数据库权限。
3>表层级
表权限适用于一个给定表中的所有列。
4>列层级
列权限适用于一个给定表中的单一列。
5>子程序层级
3》收回权限
revoke ...
4》查看权限
mysql> show grants for 'mysql'@'localhost'; +----------------------------------------------------------------------+ | Grants for mysql@localhost | +----------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'mysql'@'localhost' WITH GRANT OPTION | +----------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
4、访问控制
1》连接核实阶段
通过Host、user、password几个字段核实用户的连接请求。不能通过,则拒绝访问数据库服务器。
2》请求核实阶段
对于通过连接的会话,对于此链接上的每个请求,服务器检查用户要执行的操作,然后检查是否有足够的权限来执行它。