韩立刚老师视频教学网站 http://www.91xueit.com
韩老师QQ458717185
mySQL权限控制通过两步控制,能不能连接(验证用户身份),能执行什么操作(验证用户权限)。
验证用户身份,需要验证,连接mySQL的计算机的IP地址或计算机名称,用户账户和密码。验证过程如下:
mySQL用户存储在mysql数据库的user表,该表在mySQL服务启动时自动加载到内存,控制用户的登录。
[root@WebServer ~]# mysql -u root
查看当前连接mySQL的用户。
mysql>select user();
mysql> use mysql;
mysql> select user,host from user;
图中下划线的记录,代表可以使用任何用户在本地登录mySQL,。能够查看mysql的系统变量,但权限很低。
mysql> quit;
使用随便一个用户名登录mysql,发现都能成功。
[root@WebServer ~]# mysql -u wang
查看登录的用户名,可以看到是wang@localhost。
可以执行一些查看命令。
mysql> select @@version;
mysql> show variables;
mysql>use mysql;
mysql> quit;
使用root账户登录。
[root@WebServer ~]# mysql -u root
mysql>use mysql;
mysql> delete from user where user=‘‘;
Query OK, 2 rows affected (0.00 sec)
mysql> quit
重启mySQL服务
[root@WebServer ~]# service mysqld restart
再次使用wang登录,失败。
[root@WebServer ~]# mysql -u wang
ERROR 1045 (28000): Access denied for user ‘wang‘@‘localhost‘ (using password: NO)
[root@WebServer ~]# mysql -u root
mysql> use mysql;
mySQL用户名区分大小写,如下所示两个用户时不同的账户。下面创建的用户账户,没有指定密码,登录时不需要输入密码。
mysql> create user zhang@‘192.168.80.%‘;
mysql> create user Zhang@‘192.168.80.%‘;
mysql> create user wang;
mysql> select user,host from user;
设置zhang@‘192.168.80.%的密码为‘91xueit.com‘
mysql> set password for zhang@‘192.168.80.%‘=password(‘91xueit.com‘);
设置root@‘localhost‘账户的密码为‘91xueit.com‘。
mysql> set password for root@‘localhost‘=password(‘91xueit.com‘);
Query OK, 0 rows affected (0.00 sec)
mysql> quit
使用zhang连接mySQL,使用-h参数指定要连接的mySQL服务器地址,使用-p指明要输入密码。
[root@WebServer ~]# mysql -u zhang -h 192.168.80.222 -p
Enter password:
mysql> create user zhao@‘192.168.80.%‘ identified by ‘91xueit.com‘;
以下命令创建用户和授权同时进行,授权用户chen@‘192.168.80.%‘能够查询schoolDB数据库的全部表,密码为‘91xueit.com‘。
mysql> grant select on schoolDB.* to chen@‘192.168.80.%‘ identified by ‘91xueit.com‘;
通过create或grant命令创建用户,mySQL会触发将user表重新加载到内存,新用户就可以登录,如果直接向user表插入记录,需要刷新权限,才能使mySQL加载user表,新用户才能登录。
mysql> insert into mysql.user (user,host,password)values (‘luo‘,‘192.168.80.%‘,password(‘91xueit.com‘));
登录失败
[root@WebServer ~]# mysql -u luo -h 192.168.80.222 -p
Enter password:
ERROR 1045 (28000): Access denied for user ‘luo‘@‘192.168.80.222‘ (using password: YES)
刷新权限,将user表加载到内存。
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
再次登录,成功!
[root@WebServer ~]# mysql -u luo -h 192.168.80.222 -p
Enter password:
或输入以下命令,-u后面紧跟用户名,-p后面紧跟密码,注意:紧跟是指没有空格。
[root@WebServer ~]# mysql -uluo -p‘91xueit.com‘
主机可以使用通配符,规则和标准的SQL语法中定义的完全相同.
% 对应任意长度的字符.
_ 对应一位长度的任意字符
在mySQL服务启动时,user表会调入内存,在内存中用户账户是排序的。比如有以几个用户的排序从上往下为:
zhang | 192.168.80.222
zhang | 192.168.80.%
zhang | 192.168.%
zhang | %
有通配符的在下面,越具体的在上面,用户登录时输入账户zhang,到底是哪一个账户就看客户端的IP地址,从上往下比较,只要匹配上就认为是该用户。
直接删除mysql表中用户记录,这种方式不会触发mySQL重新加载user表到内存,该用户照样能够登录mySQL,但是执行了flush privileges命令,mySQL会重新加载user表。删除的用户不能登录。
mysql> use mysql;
mysql> delete from user where user=‘luo‘;
mysql> flush privileges;
mysql> quit
使用drop命令删除用户,会触发mySQL,将user表中的记录重新加载到内存。删除的用户就不能连接mySQL了。
mysql> drop user zhao@‘192.168.80.%‘;
授权就是为某个用户授予权限,mySQL权限控制粒度由大到小分为:
全局层级
全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。
数据库层级
数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ONdb_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。
表层级
表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
列层级
列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。
子程序层级
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。
当后续目标是一个表、一个已存储的函数或一个已存储的过程时,object_type子句应被指定为TABLE、FUNCTION或PROCEDURE。当从旧版本的My全局权限存储在在mysql数据库user表中,数据库权限存储在mysql数据库的db表中,表权限存储在mysql数据库的tables_priv表中,列权限存储在columns_priv表中。
客户端验证权限的过程。
授予‘zhang‘@‘192.168.80.%‘能够查询和更改schoolDB.Tstudent表的studentid,sname列。
mysql> grant select(studentid,sname) on schoolDB.TStudent to ‘zhang‘@‘192.168.80.%‘;
mysql> grant update(studentid,sname) on schoolDB.TStudent to ‘zhang‘@‘192.168.80.%‘;
查询列的权限表,可以看到授予的权限。
select * from mysql.columns_priv
使用图形界面管理工具,使用zhang用户连接mySQL。
选择schoolDB数据库,选择客户端字符集,点击“Finish”。
查询studentid、sname两列成功。
select studentid,sname from Tstudent
查询所有列失败。
select * from Tstudent
SELECT command denied to user ‘zhang‘@‘192.168.80.2‘ for table ‘TStudent‘
更新姓名成功
update TStudent set sname=‘韩立刚‘ where studentid=‘00001‘
更新email列失败。
update TStudent set email=‘onesthan@hotmail.com‘ where studentid=‘00001‘
UPDATE command denied to user ‘zhang‘@‘192.168.80.2‘ for column ‘email‘ in table ‘TStudent‘
删除前面授予的‘zhang‘@‘192.168.80.%‘访问Tstudent表列的权限。
mysql> revoke select(studentid,sname) on schoolDB.TStudent from ‘zhang‘@‘192.168.80.%‘;
mysql> revoke update(studentid,sname) on schoolDB.TStudent from ‘zhang‘@‘192.168.80.%‘;
使用一条SQL语句,也可授权用户对表的指定列进行查询和更改。
mysql> grant select(studentid,sname),update(studentid,email) on schoolDB.TStudent to ‘zhang‘@‘192.168.80.%‘;
查询列的权限表,可以看到授予的权限。
select * from mysql.columns_priv
mysql> revoke select(studentid,sname),update(studentid,email) on schoolDB.TStudent from ‘zhang‘@‘192.168.80.%‘;
授予用户‘zhang‘@‘192.168.80.%‘对schoolDB.Tstudent表能够增删改查。
mysql> grant select on schoolDB.TStudent to ‘zhang‘@‘192.168.80.%‘;
mysql> grant update,delete,insert on schoolDB.TStudent to ‘zhang‘@‘192.168.80.%‘;
查询列的权限表,可以看该表没有记录。
select * from mysql.columns_priv
查询表的权限表,可以看到授予的权限。
select * from tables_priv;
取消表级权限
mysql> revoke update on schoolDB.TStudent from ‘zhang‘@‘192.168.80.%‘;
mysql> revoke delete,insert,select on schoolDB.TStudent from ‘zhang‘@‘192.168.80.%‘;
授予用户对数据库中所有表进行select、delete、update和insert权限,schoolDB.*的“*”代表schoolDB的所有表。
mysql> grant select on schoolDB.* to ‘zhang‘@‘192.168.80.%‘;
mysql> grant insert,delete,update on schoolDB.* to ‘zhang‘@‘192.168.80.%‘;
以下命令授予用户在数据库中创建表的权限。
mysql> grant create on schoolDB.* to ‘zhang‘@‘192.168.80.%‘;
以下命令授予用户能够创建视图的权限。
mysql> grant create view on schoolDB.* to ‘zhang‘@‘192.168.80.%‘;
查看数据库级别的权限表。Y代表有该列对应的权限,N代表没有该列对应的权限。
select * from db;
授予用户对数据库全部的权限,
mysql> grant all privileges on schoolDB.* to ‘zhang‘@‘192.168.80.%‘;
或
mysql> grant all on schoolDB.* to ‘zhang‘@‘192.168.80.%‘;
取消授予的用户全部数据库级别的权限,这个命令并不删除表级和列级的授予的权限。
mysql> revoke all privileges on schoolDB.* from ‘zhang‘@‘192.168.80.%‘;
使用with grant option参数,‘zhang‘@‘192.168.80.%‘可以授权其他用户有相应的权限,你不能授予其他用户你自己不具备的权限;
mysql> grant all on schoolDB.* to ‘zhang‘@‘192.168.80.%‘ with grant option;
取消授予的权限。
mysql> revoke all on schoolDB.* from ‘zhang‘@‘192.168.80.%‘;
取消用户授权其他用户权限的权限。
mysql> revoke grant option on schoolDB.* from ‘zhang‘@‘192.168.80.%‘;
授予‘zhang‘@‘192.168.80.%‘全局select权限。
mysql> grant select on *.* to ‘zhang‘@‘192.168.80.%‘;
查看mysql数据库的user表,可以看到授予的全局权限,
select * from user;
授予‘zhang‘@‘192.168.80.%‘全局全部权限。
mysql> grant all on *.* to ‘zhang‘@‘192.168.80.%‘;
再次查看mysql数据库的user表,可以看‘zhang‘@‘192.168.80.%‘用户拥有了全部的全局权限。
select * from user;
查看当前用户的权限.
mysql>show grants;
使用以下命令查看授予‘zhang‘@‘192.168.80.%‘的访问权限。
mysql> show grants for ‘zhang‘@‘192.168.80.%‘;
撤销授予用户的权限时,也要考虑拟撤销的是哪一级权限。
输入以下命令会撤销用户全部全局权限,该命令不会撤销授予用户的数据级的权限和表级、列级的权限。
mysql> revoke all on *.* from ‘zhang‘@‘192.168.80.%‘;
输入以下命令会撤销用户全部的schoolDB数据库级别权限。该命令不会撤销授予用户表级和列级的权限。
mysql> revoke all on schoolDB.* from ‘zhang‘@‘192.168.80.%‘;
输入以下命令会撤销用户全部的对Tstudent表的访问权限。该命令不会撤销授予用户列级的权限。
mysql> revoke all on schoolDB.TStudent from ‘zhang‘@‘192.168.80.%‘;
输入以下命令会撤销用户对Tstudent表的studentid、sname列的查询权限。
mysql> revoke select(studentid,sname) on schoolDB.TStudent from ‘zhang‘@‘192.168.80.%‘;
使用mySQL Manager连接,点击 ,出现管理mySQL用户的界面,可以看到现有的全部用户,可以创建新用户,删除用户,编辑用户,可以看到用户的全局权限。
点击下图中 ,可以授予用户全局权限,数据库权限,表权限,列权限。
grant数据库开发人员(yangql402),创建表、索引、视图、存储过程、函数等权限。
grant创建、修改、删除 MySQL 数据表结构权限。
grant create on schoolDB.* to ‘zhang’@’192.168.80.%’;
grant alteron schoolDB.* to‘zhang’@’192.168.80.%’;
grant dropon schoolDB.* to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 临时表权限。
grant create temporary tables on schoolDB.* to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 索引权限。
grant index onschoolDB.*to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 视图、查看视图源代码权限。
grant create view on schoolDB.* to‘zhang’@’192.168.80.%’;
grant showview on schoolDB.* to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 存储过程、函数权限。
grant create routine on schoolDB.* to‘zhang’@’192.168.80.%’;
grant alter routine on schoolDB.* to‘zhang’@’192.168.80.%’;
grant executeon schoolDB.* to‘zhang’@’192.168.80.%’;
授予执行指定存储过程或使用函数的权限.
mysql> grant execute on procedure schoolDB.gets to ‘zhang‘@‘192.168.80.%‘;
mysql> grant execute on function schoolDB.create_name to ‘zhang‘@‘192.168.80.%‘;
该权限存储在mysql数据库的procs_priv表中,执行以下命令能够查看授予的权限。
select * from procs_priv;
以下SQL语句取消执行gets存储过程的权限。
mysql> revoke execute on procedure schoolDB.gets from ‘zhang‘@‘192.168.80.%‘;
以下SQL语句取消使用create_name函数的权限。
mysql> revoke execute on function schoolDB.create_name from ‘zhang‘@‘192.168.80.%‘;
以下SQL语句在数据库级别授权用户能够执行该数据库全部存储过程和使用全部函数。
mysql> grant execute on schoolDB.* to ‘zhang‘@‘192.168.80.%‘;
忘记了root密码,可以更改配置文件,在[mysqld]段中加入一行“skip-grant-tables”,重启mySQL服务,可以使用root账号空密码登录mySQL。
重设mySQL管理员密码的步骤:
1. 更改配置mySQL服务配置文件
[root@WebServer ~]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
max_connections=200
skip-grant-tables
2. 保存配置文件
3. 重启mySQL服务
[root@WebServer ~]# service mysqld restart
4. 使用root账户空密码连接mySQL
[root@WebServer ~]# mysql -u root
mysql> use mysql;
5. 通过以下方式更改root用户密码,失败。因为mySQL使用skip-grant-tables选项启动,就不能使用这个命令更改密码。
mysql> set password for root@‘localhost‘=password(‘123‘);
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
6. 通过直接更改表的方式设置root’账户密码,以下命令设置全部登录账户是root的密码。
mysql> update user set password=password(‘123‘) where user=‘root‘;
7. 退出mySQL
mysql> quit
8. 编辑mySQL配置文件,注释掉#skip-grant-tables
[root@WebServer ~]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
max_connections=200
#skip-grant-tables
9. 保存退出
10. 重启mySQL服务
11. 重启mySQL服务
[root@WebServer ~]# service mysqld restart
12. 使用新密码登录。
[root@WebServer ~]# mysql -u root -p
Enter password:
本文出自 “韩立刚” 博客,请务必保留此出处http://91xueit.blog.51cto.com/400469/1733895
原文地址:http://91xueit.blog.51cto.com/400469/1733895