MySQL的权限管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的权限管理相关的知识,希望对你有一定的参考价值。

权限管理的概念:

MySQL权限管理主要是对登陆mysql的用户进行验证,合理的权限规划会提高MySQL服务器的安全。

1,验证主机,用户名,密码  (从哪里来)

2,验证操作权限,比如:select,update,delete (可以做什么)


MySQL的各种权限:

账户权限信息存储在MySQL的user,db,host,table_priv,columns_priv和procs_priv表中,启动数据库,会读入内存

 mysql权限表的验证过程为:

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,以此类推。

技术分享

技术分享


1,CREATE和DROP权限,可以创建新数据库和表,或删除已有数据库和表,

如果将mysql数据库中的DROP权限授权予某用户,用户可以删掉MySQL访问权限保存的数据库

2、SELECT、INSERT、UPDATE和DELETE权限允许在一个数据库现有的表上实施操作

3、SELECT权限只有在它们真正从一个表中检索行时才被用到

4,INDEX权限允许创建或删除索引,INDEX适用已有表。

如果具有某个表的CREATE权限,可以在CREATE TABLE语句中包含索引定义

5,ALTER权限,可以使用ALTER TABLE来更改表的结构和重新命名表

6,CREATE ROUTINE权限来创建保存的程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序,EXECUTE权限用来执行保存的程序


mysqladmin命令

1,reload命令告诉服务器将授权表重新读入内存

2,flush-privileges是reload的同义词

3,refresh命令清空所有表并关闭/打开记录文件


shutdown命令关闭服务器

processlist命令显示在服务器内执行的线程的信息。

kill命令杀死服务器线程。用户总是能显示或杀死自己的线程,但是需要process权限来显示或者杀死其他用户和super权限启动的线程


授权:

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,表层级

权限存储在mysql.tables_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限

4,列层级

存储在mysql.columns_priv表中。当使用REVOKE时,必须指定与被授权列相同的列

5,子程序层级


GRANT的语法:

GRANT priv_type [(columns)] [,priv_type [(columns)]] ... 

ON [object_type] table1,table2,...,tablen

TO user [IDENTIFIED BY [PASSWORD] ‘password‘]

[,USER [IDENTIFIED BY [PASSWORD] ‘password‘]] ...

 [WITH GRANT OPTION]


object_type = TABLE  |  FUNCTION  |  PROCEDURE


GRANT OPTION 取值:

| MAX_QUERIES_PER_HOUR count

| MAX_UPDATES_PER_HOUR count

| MAX_CONNECTIONS_PER_HOUR count

| MAX_USER_CONNECTIONS count


例子:

使用GRANT语句创建一个新的用户grantUser,密码为“grantpwd”。用户grantUser对所有的数据有查询、插入权限,并授予GRANT权限。

mysql> GRANT select,insert ON *.* TO ‘grantUser‘@‘localhost‘ identified by ‘grantpwd‘ with grant option;

Query OK, 0 rows affected (0.00 sec)


mysql> select host,user,select_priv,insert_priv,grant_priv from mysql.user where user=‘grantUser‘;

+-----------+-----------+-------------+-------------+------------+

| host      | user      | select_priv | insert_priv | grant_priv |

+-----------+-----------+-------------+-------------+------------+

| %         | grantUser | Y           | Y           | N          | 

| localhost | grantUser | Y           | Y           | Y          | 

+-----------+-----------+-------------+-------------+------------+


收回权限

第一种语法是收回所有用户的所有权限,用于取消对已命名的用户的所有全局层级,数据库层级,表层级和列层级的权限

REVOKE ALL PRIVILEGES,GRANT OPTION FROM ‘user‘@‘host‘ [,‘user‘@‘host‘ ...]


另一种长格式的REVOKE语句

REVOKE priv_type [(columns)] [,priv_type [(columns)]] ...

ON table1,table2,...,tablen

FROM ‘user‘@‘host‘ [,‘user‘@‘host‘ ...]


例子:

使用REVOKE语句取消用户testUser的更新权限。

mysql> grant update on *.* to ‘testUser‘@‘%‘ identified by ‘wpf926,.‘;

Query OK, 0 rows affected (0.00 sec)

mysql> select update_priv,user,host  from mysql.user where user=‘testUser‘;

+-------------+----------+-----------+

| update_priv | user     | host      |

+-------------+----------+-----------+

| Y           | testUser | localhost | 

| Y           | testUser | %         | 

+-------------+----------+-----------+

2 rows in set (0.00 sec)


mysql> revoke update on *.* from ‘testUser‘@‘%‘;

Query OK, 0 rows affected (0.00 sec)

mysql> select update_priv,user,host from mysql.user where user=‘testUser‘;

+-------------+----------+-----------+

| update_priv | user     | host      |

+-------------+----------+-----------+

| Y           | testUser | localhost | 

| N           | testUser | %         | 

+-------------+----------+-----------+

2 rows in set (0.00 sec)


mysql> revoke update on *.* from ‘testUser‘@‘localhost‘;

Query OK, 0 rows affected (0.00 sec)


mysql> select update_priv,user,host from mysql.user where user=‘testUser‘;

+-------------+----------+-----------+

| update_priv | user     | host      |

+-------------+----------+-----------+

| N           | testUser | localhost | 

| N           | testUser | %         | 

+-------------+----------+-----------+

2 rows in set (0.00 sec)




查看权限

show grant查看账户信息的语法:

show grant for ‘user’@‘host’;


例子:

使用show grants语句查询用户testUser的权限

mysql> show grants for ‘testUser‘@‘%‘;

+--------------------------------------------------------------------------------+

| Grants for [email protected]%                                                          |

+--------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO ‘testUser‘@‘%‘ IDENTIFIED BY PASSWORD ‘64c4cd3a456ed50e‘ | 

+--------------------------------------------------------------------------------+

1 row in set (0.00 sec)


mysql> show grants for ‘testUser‘@‘localhost‘;

+-----------------------------------------------------------------------------------------+

| Grants for [email protected]                                                           |

+-----------------------------------------------------------------------------------------+

| GRANT SELECT ON *.* TO ‘testUser‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘565491d704013245‘ | 

+-----------------------------------------------------------------------------------------+

1 row in set (0.00 sec)







以上是关于MySQL的权限管理的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的权限管理

MySQL用户及权限管理

mysql权限管理

MySQL列权限和程序权限管理

MySQL权限管理

MySQL权限管理