且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

mySQL用户和权限管理v1

更新时间:2022-08-13 09:19:44

第01章 MySQL用户和权限管理

mySQL权限控制通过两步控制,能不能连接(验证用户身份),能执行什么操作(验证用户权限)。

验证用户身份,需要验证,连接mySQL的计算机的IP地址或计算机名称,用户账户和密码。验证过程如下:

mySQL用户和权限管理v1

管理mySQL用户

查看mySQL用户账户

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用户和权限管理v1

mysql> quit;

使用随便一个用户名登录mysql,发现都能成功。

[root@WebServer ~]# mysql -u wang

查看登录的用户名,可以看到是wang@localhost

mySQL用户和权限管理v1

可以执行一些查看命令。

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)

创建mySQL用户账户

[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;

mySQL用户和权限管理v1

设置mySQL用户密码

设置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';

grant方式创建用户

以下命令创建用户和授权同时进行,授权用户chen@'192.168.80.%'能够查询schoolDB数据库的全部表,密码为'91xueit.com'。

mysql> grant select on schoolDB.* to chen@'192.168.80.%' identified by '91xueit.com';

向user表插入记录的方式创建用户

通过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表中用户记录,这种方式不会触发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权限级别

授权就是为某个用户授予权限,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表中。

mySQL用户和权限管理v1

客户端验证权限的过程。

mySQL用户和权限管理v1

授予列权限

授予'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

mySQL用户和权限管理v1

验授予的列权限

使用图形界面管理工具,使用zhang用户连接mySQL。

mySQL用户和权限管理v1

选择schoolDB数据库,选择客户端字符集,点击“Finish”。

mySQL用户和权限管理v1

查询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用户和权限管理v1

删除授权的权限。

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用户和权限管理v1

取消表级权限

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用户和权限管理v1

授予用户对数据库全部的权限,

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;

mySQL用户和权限管理v1

授予'zhang'@'192.168.80.%'全局全部权限。

mysql> grant all on *.* to 'zhang'@'192.168.80.%';

再次查看mysql数据库的user表,可以看'zhang'@'192.168.80.%'用户拥有了全部的全局权限。

select * from user;

mySQL用户和权限管理v1

查看授予的权限

查看当前用户的权限.

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用户和权限管理v1,出现管理mySQL用户的界面,可以看到现有的全部用户,可以创建新用户,删除用户,编辑用户,可以看到用户的全局权限。

mySQL用户和权限管理v1

点击下图中 mySQL用户和权限管理v1,可以授予用户全局权限,数据库权限,表权限,列权限。

mySQL用户和权限管理v1

能够授权访问的对象

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;

mySQL用户和权限管理v1

以下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.%';

恢复mySQL管理员账户密码

忘记了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:




本文转自 onesthan 51CTO博客,原文链接:http://blog.51cto.com/91xueit/1733895,如需转载请自行联系原作者