MySQL中的账号与权限管理

MySQL权限管理

权限系统的工作原理    

MySQL权限系统通过下面两个阶段进行认证:

(1)对连接的用户进行身份认证,合法的用户通过认证、不合法的用户拒绝连接。

(2)对通过认证的合法用户赋予相应的权限,用户可以在这些权限范围内对数据库做相应的操作。

对于身份,MySQL是通过IP地址和用户名联合进行确认的,例如MySQL安装默认创建的用户[email protected]表示用户root只能从本地(localhost)进行连接才可以通过认证,此用户从其他任何主机对数据库进行的连接都将被拒绝。也就是说,同样的一个用户名,如果来自不同的IP地址,则MySQL将其视为不同的用户。

MySQL的权限表在数据库启动地时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了。

权限表的存取

在权限存取的两个过程中,系统会用到“mysql”数据库(安装MySQL时被创建,数据库名字叫“mysql”)中user、host和db这3个最重要的权限表

表名 user db host
用户列  User                     Host                   Host                 
   Password                 Db                     Db                   
权限列  Select_priv              User                   Select_priv          
   Insert_priv              Select_priv            Insert_priv          
   Update_priv              Insert_priv            Update_priv          
   Delete_priv              Update_priv            Delete_priv          
   Create_priv              Delete_priv            Create_priv          
   Drop_priv                Create_priv            Drop_priv            
   Reload_priv              Drop_priv              Grant_priv           
   Shutdown_priv            Grant_priv             References_priv      
   Process_priv             References_priv        Index_priv           
   File_priv                Index_priv             Alter_priv           
   Grant_priv               Alter_priv             Create_tmp_table_priv
   References_priv          Create_tmp_table_priv  Lock_tables_priv     
   Index_priv               Lock_tables_priv       Create_view_priv     
   Alter_priv               Create_view_priv       Show_view_priv       
   Show_db_priv             Show_view_priv         Create_routine_priv  
   Super_priv               Create_routine_priv    Alter_routine_priv   
   Create_tmp_table_priv    Alter_routine_priv     Execute_priv         
   Lock_tables_priv         Execute_priv           Trigger_priv         
   Execute_priv             Event_priv              
   Repl_slave_priv          Trigger_priv            
   Repl_client_priv           
   Create_view_priv           
   Show_view_priv             
   Create_routine_priv        
   Alter_routine_priv         
   Create_user_priv           
   Event_priv                 
   Trigger_priv               
   Create_tablespace_priv     
安全列  ssl_type                   
   ssl_cipher                 
   x509_issuer                
   x509_subject               
   max_questions              
   max_updates                
   max_connections            
   max_user_connections       

在这个3表中,最重要的表

其中,通常用得最多的是用户列和权限列,其中权限列在分为普通权限和管理权限。普通权限主要用于数据库的操作,比如select_priv、create_priv等。而管理权限主要用来对数据库进行管理的操作,比如process_priv、super_priv等。

当用户进行连接的时候,权限表的存取过程有以下现个阶段。

  • 先从user表中的host、user和passwd这3个字段中判断连接的IP、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。
  • 如果通过身份验证,则按照以下权限表的顺序得到数据库权限:user->db->tables_priv->coloumns_priv。

在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限。

上面的第一阶段好理解,下面以一个例子来详细解释一下第二阶段。

(1)创建用户[email protected],并赋予所有数据库的所有表的select权限。

mysql> grant select on *.* to [email protected];
Query OK, 0 rows affected (0.05 sec)
mysql> select * from user where user=‘cqh‘ and host=‘localhost‘ \G
*************************** 1. row ***************************
                  Host: localhost
                  User: cqh
              Password:
           Select_priv: Y
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           ...

(2)再来看db表:

mysql> select * from db where user=‘cqh‘;
Empty set (0.00 sec)

可以发现,user表的select_priv列是“Y”,而db表中并没有记录,也就是说,对所有数据库都具有相同的权限的用户记录并不需要记入db表,而仅仅需要将user表中的select_priv改为“Y”即可。换句话,user表中的每个权限都代表了对所有数据库都有的权限。

(3)将[email protected]上的权限改为只对test数据库上所有表的select权限。

mysql> revoke select on *.* from [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> grant select on test.* to [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user=‘cqh‘ and host=‘localhost‘ \G
*************************** 1. row ***************************
                  Host: localhost
                  User: cqh
              Password:
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string: NULL
1 row in set (0.00 sec)
mysql> select * from db where user=‘cqh‘\G
*************************** 1. row ***************************
                 Host: localhost
                   Db: test
                 User: cqh
          Select_priv: Y
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: N
         Trigger_priv: N
1 row in set (0.00 sec)

这个时候发现,user表中的select_priv变为“N”,而db表中则增加了db为test的一条记录,也就是说,当只授予数据库某些权限时,user表中的相应权限时,user表中的相应权限列保持“N”,而将具体的数据库权限写入db表。

table和column的权限机制和db类似,这里就不再赘述了。

从上面的例子可以看出,当用户通过权限认证,进行权限分配时,将按照user->db->tables_priv->coloumns_priv的顺序进行权限分配,即先检查全局权限表user,如果user中对应权限为“Y”,则此用户对所有数据库的权限都为“Y”,将不再检查db、tables_priv和coloumns_priv;如果为“N”,则到db表中检查此用户对应的具体数据库,并得到db中为“Y”的权限;如果db中相应的权限为“N”,则检查tables_priv中此数据库对应的具体表,取得表中为“Y”的权限;如果tables_priv中相应权限为“N”,则检查columns_priv中此表对应的具体列,取得列中为“Y”的权限。

账号管理

账号管理主要包括账号的创建、权限更改和账号的删除。用户连接数据库的第一步都从账号创建开始。

有两种方法可以用来创建账号:使用GRANT语法创建或者直接操作授权表,但更推荐使用第一种方法,因为操作简单,出错几率更少。

方式一.创建账号

GRANT的常用语法如下 :

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]
GRANT PROXY ON user_specification
    TO user_specification [, user_specification] ...
    [WITH GRANT OPTION]
object_type:
    TABLE
  | FUNCTION
  | PROCEDURE

来看下面的几个例子。

例1:创建用户cqh,权限为可以在所有数据库上执行所有权限,只能从本地进行连接。

mysql> grant all privileges on *.* to [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user=‘cqh‘ and host=‘localhost‘ \G
*************************** 1. row ***************************
                  Host: localhost
                  User: cqh
              Password:
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: N
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string: NULL
1 row in set (0.00 sec)

可以发现,除了Grant_priv权限外,所有权限在user表里都是“Y”。

例2:在例1基础上,增加对cqh的grant权限

mysql> grant all privileges on *.* to [email protected] with grant option;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user=‘cqh‘ and host=‘localhost‘ \G
*************************** 1. row ***************************
                  Host: localhost
                  User: cqh
              Password:
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string: NULL
1 row in set (0.00 sec)

例3:在例2基础上,设置密码为“123”。

mysql> grant all privileges on *.* to [email protected] identified by ‘123‘ with grant option;
Query OK, 0 rows affected (0.00 sec)

从user表中查看修改的密码:

mysql> select * from user where user=‘cqh‘ and host=‘localhost‘ \G
*************************** 1. row ***************************
                  Host: localhost
                  User: cqh
              Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string: NULL
1 row in set (0.00 sec)

可以发现,密码变成了一堆加密后的字符串。在MySQL5.0里面,密码的算法是生成一个以*开始的41位的字符串,而MySQL4.0之前是16位,因此安全性大大提高。

例4:创建新用户chenqionghe,可以从任何IP进行连接,权限为test数据库里的所有表进行SELECT、UPDATE、INSERT和DELETE操作,初始密码为“123”。

mysql> grant select,insert,update,delete on test.* to ‘chenqionghe‘@‘%‘ identified by ‘123‘;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user where user=‘chenqionghe‘ and host=‘%‘ \G
*************************** 1. row ***************************
                  Host: %
                  User: chenqionghe
              Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string: NULL
1 row in set (0.00 sec)
mysql> select * from db where user=‘chenqionghe‘ and host=‘%‘ \G
*************************** 1. row ***************************
                 Host: %
                   Db: test
                 User: chenqionghe
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: N
            Drop_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: N
         Trigger_priv: N
1 row in set (0.00 sec)

如上文所述,user表中的权限都是“N”,db表中增加的记录权限则都是“Y”。一般地,我们只授予用户适当的权限,而一般不会授予过多的权限,本例中的权限适合大多数应用账号。

本例中的IP限制为所有IP都可以连接,因此设置为“*”,mysql数据库中是通过user表的host字段来进行控制,host可以是以下类型的值。

  • Host值可以是主机名或IP号,或“localhost"批出本地主机
  • 可以在Host列值使用通配符字符“%”和“_”。
  • Host值“%”匹配任何主机名,空Host值等价于“%”。它们的含义与LIKE操作符的模式匹配操作相同。例如,“%”的Host值与所有主机名匹配,而“%.mysql.com”匹配mysql.com域的所有主机。

host和user组合进行连接的例子

Host值 User值 被条目匹配的连接
cqh.loc.gov cqh cqh,从cqh.loc.gov连接
cqh.loc.gov   任何用户,从cqh.loc.gov连接
% cqh cqh,从任何主机连接
%   任何用户,从任何主机连接
%.loc.gov cqh cqh,从在loc.gov域的任何主机连接
x.y.% cqh cqh,从x.y.net、x.y.com、x.y.edu等连接
114.115.166.177 cqh cqh,从有114.115.166.177IP地址的主机连接
114.115.166.% cqh cqh,从144.155.166C类子网的任何主机连接

可能大家会有这样的疑问,如果权限表中的Host既有“cqh.loc.gov”,又有“%”,而此时,连接从主机cqh.loc.gov过来。显然,user表里面这两条记录都符合匹配条件,那系统会选择哪一个呢?

如果有多个匹配,服务器必须选择使用哪个条目。按照下述原则来解决:

  • 服务器在启动时读入user表后进行排序;
  • 然后当用户试图连接时,以排序的顺序浏览条目;
  • 服务器使用与客户端和用户名匹配的第一行。

当服务器读取表时,它首先以最具体的Host值排序。主机名和IP号是具体的。“%”意味着“任何主机”并且是最不特定的。有相同Host值的条目首先以最具体的User值排序(空User值意味着“任何用户”并且是最不特定的)。

注意:mysql数据库的user表中host值为%或者空,表示所有外部IP都可以连接,但是不包括本地服务器local,因此,如果要包括本地服务器、必须单独为local赋予权限。

例5:授予SUPER、PROCESS、FILE权限给用户[email protected]%;

mysql> grant super,process,file on *.* to ‘cqh2‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

因为这几个权限都属于管理权限,因此不能够指定某个数据库,on后面必须跟“*.*”,下面的语法将提示错误:

mysql> grant super,process,file on test.* to ‘cqh2‘@‘%‘;
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

 例6:只授予登录权限给[email protected]

mysql> grant usage on *.* to ‘cqh3‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
[[email protected] ~]# mysql -ucqh3
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1640
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

usage权限只能用于数据库登录,不能执行任何操作。

直接操作权限表也可以进行权限的创建,其实GRANT操作的本质就是修改权限后进行权限的刷新,因此,GRANT比操作权限表更简单,下面继续以上文的例子来说明一下更新权限的用法。

创建新用户chenqionghe,可以从任何IP进行连接,权限对test库里的所有表进行SELECT、UPDATE、INSERT和DELETE,初始密码为123

mysql> grant select,insert,update,delete on test.* to ‘chenqionghe‘@‘%‘ identified by ‘123‘;

方式二:直接操作权限表

直接操作权限表如下:

[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1560
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use mysql;
Database changed
mysql> insert into db (host,db,user,select_priv,insert_priv,update_priv,delete_priv) values (‘%‘,‘test‘,‘chenqionghe‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘);
Query OK, 1 row affected (0.00 sec)
mysql> flush privileges;

mysql> exit;
Bye
[[email protected] ~]# mysql -ucqh3
ERROR 1045 (28000): Access denied for user ‘cqh3‘@‘localhost‘ (using password: NO)
[[email protected] ~]# mysql -ucqh3 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1643
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)

查看和更改账号的权限

创建完账号后,时间长了可能就会忘记分配的权限而需要查看账号权限,也在可能会经过一段时间后需要更改以前的账号权限,下面介绍查看和更改这两种操作命令。

  • 查看权限

账号创建好后,可以通过如下命令查看权限;

show grants for [email protected];

如以下示例

mysql> show grants for [email protected];
+---------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                                              |
+---------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘cqh‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257‘ WITH GRANT OPTION |
| GRANT SELECT ON `test`.* TO ‘cqh‘@‘localhost‘                                                                                         |
+---------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

host可以不写,默认是“%”,如下所示

mysql> show grants for chenqionghe;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘chenqionghe‘@‘%‘ IDENTIFIED BY PASSWORD ‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257‘ |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

对于MySQL5.0以后的版本,也可以利用新新增的information_schema数据库进行权限的查看;

mysql> select * from SCHEMA_PRIVILEGES where grantee="‘cqh‘@‘localhost‘";
+-------------------+---------------+--------------+----------------+--------------+
| GRANTEE           | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------+---------------+--------------+----------------+--------------+
| ‘cqh‘@‘localhost‘ | def           | test         | SELECT         | NO           |
+-------------------+---------------+--------------+----------------+--------------+
1 row in set (0.00 sec)
  • 更改权限

可以进行权限的新增和回收。和账号创建一样,权限变更也在两种办法:使用GRANT(新增)和REVOKE(回收)语句,或者更改权限表。

第二种方法和前面一样,直接对user、db、tables_priv和columns_priv中的权限进行更新即可,这里重点介绍第一种方法。

和创建账号的语法完全一样,GRANT可以直接用来对账号进行增加。其实GRANT语句在执行的时候,如果权限表中不存在目标账号,则创建账号;如果已经存在,则执行权限的新增。来看下面一个例子。

(1)[email protected]目前只有登录的权限。

mysql> show grants for [email protected];
+------------------------------------------+
| Grants for [email protected]                |
+------------------------------------------+
| GRANT USAGE ON *.* TO ‘cqh3‘@‘localhost‘ |
+------------------------------------------+
1 row in set (0.00 sec)

(2)赋予[email protected]所有数据库上的所有表的SELECT权限。

mysql> grant select on *.* to ‘cqh3‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
+-------------------------------------------+
| Grants for [email protected]                 |
+-------------------------------------------+
| GRANT SELECT ON *.* TO ‘cqh3‘@‘localhost‘ |
+-------------------------------------------+
1 row in set (0.00 sec)

(3)继续给[email protected]赋予SELECT和INSERT权限,和已胡的SELECT权限进行合并。

mysql> show grants for [email protected];
+-------------------------------------------+
| Grants for [email protected]                 |
+-------------------------------------------+
| GRANT SELECT ON *.* TO ‘cqh3‘@‘localhost‘ |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> grant select,insert on *.* to ‘cqh3‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
+---------------------------------------------------+
| Grants for [email protected]                         |
+---------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO ‘cqh3‘@‘localhost‘ |
+---------------------------------------------------+
1 row in set (0.00 sec)

(4)REVOKE语句可以回收已经赋予的权限,语法如下:

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] ...
REVOKE PROXY ON user
    FROM user [, user] ...

对于上面的例子,这里决定要收回[email protected]上的INSERT和SELECT权限:

mysql> revoke select,insert on *.* from [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
+------------------------------------------+
| Grants for [email protected]                |
+------------------------------------------+
| GRANT USAGE ON *.* TO ‘cqh3‘@‘localhost‘ |
+------------------------------------------+
1 row in set (0.00 sec)

usage权限不能被回收,也就是说,REVOKE用户并不能删除用户。

mysql> show grants for [email protected];
+------------------------------------------+
| Grants for [email protected]                |
+------------------------------------------+
| GRANT USAGE ON *.* TO ‘cqh3‘@‘localhost‘ |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> revoke usage on *.* from [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
+------------------------------------------+
| Grants for [email protected]                |
+------------------------------------------+
| GRANT USAGE ON *.* TO ‘cqh3‘@‘localhost‘ |
+------------------------------------------+
1 row in set (0.00 sec)
  • 修改密码

方法1:可以用mysqladmin命令在命令行指定密码。

shell> mysqladmin -u user_name -h host_name password "newpwd"

方法2:执行SET PASSWORD语句。下例中将账号‘chenqionghe‘@‘%‘的密码改为“cqh123”

SET PASSWORD FOR ‘chenqionghe‘@‘%‘ = PASSWORD(‘cqh123‘);

如果是更改自己的密码,可以省略for语句:

SET PASSWORD = PASSWORD(‘cqh123‘);

方法3:还可以在全局级别使用GRANT USAGE语句(在*.*)来指定某个账户的密码而不影响账户当前的权限。

GRANT USAGE ON *.* TO ‘chenqionghe‘@‘%‘ IDENTIFIED BY ‘cqh123‘;

方法4:直接更改数据库的user表。

mysql> INSERT INTO user (Host,User,Password) VALUES(‘%‘,‘chenqionghe‘,PASSWORD(‘333333‘));
mysql> FLUSH PRIVILEGES;
mysql> UPDATE user SET Password = PASSWORD(‘333333‘) WHERE Host=‘%‘ AND User=‘chenqionghe‘;
mysql> FLUSH PRIVILEGES;

注意:更改密码的时候一定要使用PASSWORD函数(mysqladmin和GRANT两种方式不用写,会自动加上)。

  • 删除账号

要彻底删除账号,同样也有两种方法:DROP USER命令和修改权限表。

DROP USER语法非常简单,具体如下:

DROP USER user [, user] ...

举一个单的例子,将[email protected]用户删除

mysql> show grants for [email protected];
+------------------------------------------+
| Grants for [email protected]                |
+------------------------------------------+
| GRANT USAGE ON *.* TO ‘cqh3‘@‘localhost‘ |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> drop user [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
ERROR 1141 (42000): There is no such grant defined for user ‘cqh3‘ on host ‘localhost‘

修改权限表方法只要把user用户中的用户记录删除即可,这里不再演示

到这里,就把衣钵都传给你们了,如果觉得文章不错可以关注下,或者点个赞哦~

时间: 2024-11-05 16:33:37

MySQL中的账号与权限管理的相关文章

Linux中的账号和权限管理(理论讲解部分)

小伙伴们本次给大家带来的是Linux中的账号和权限管理,这里我们首先要明确的就是这个权限是文件或者目录的权限.接下来我们会从以下几个部分进行了解: 用户账号和组账号概述 用户账号和组账号管理 查询账号信息 查看目录或文件的属性 设置目录或文件的权限 设置目录或文件的归属 用户账号和组账号概述Linux基于用户身份对资源访问进行控制1.用户账号:? 超级用户? 普通用户? 匿名用户(everyone)? 程序用户(人为不可使用,单独管理系统中某个应用程序存在的服务)2.组账号:组是系统用户权限的集

linux基础概念和个人笔记总结(2)——账号和权限管理实验验证

特此感谢! 教员:张仁珑 班主任:傅春华 我想给予他们最崇高的敬意 防伪码:滴水之恩,涌泉相报 感想:当我今天在首页上看到了自己发的文章,这是我的第九篇文档,觉得心里特别开心,也真正理解了 "努力和收获是成正比的."这句话.刚好也正准备整理Linux相关笔记,心里五味杂陈,仿佛就在昨天,似乎就在眼前. 总而言之,没有他们就没有今天的我! 第四章:账号和权限管理 实验要求: 1.建立用户目录 /benet/teachers 和 /benet/students,分别用于存放不同身份用户的宿

linux     第六章 账号和权限管理

linux     第六章 账号和权限管理 享受生活热爱挑战 明远分享 每章一段话: 每一个优秀的人,都有一段沉默的时光.人总会有困难丶会被别人不理睬丶这个时候就是你最关键的时候,我们需要相信生活,不放弃,命运不会抛弃你,苦过方可甜. 今天我们要学习在linux中的用户和组的各种配置和管理,其实不要想命令多难记,其实多敲几遍就记住了,想它越简单你就越容易达成你的目标. 理论: Linux基于用户身份对资源访问进行控制     我们先来看下linux用户帐号和组的分类: ①超级用户root    

linux账号和权限管理

账号和权限管理 要求: 一,建立用户目录: 创建目录/tech/benet和/tech/accp,分别用于存放各项目组中用户账户的宿主文件. 步骤:如图所示: 二,添加组账号: 为两个项目添加组账号benet.accp,GID号分别设置为1001 .1002 为技术部添加组账号tech,GID号设置为200 步骤:如图所示: 添加.删除.修改组账号: groupadd命令-添加组账号 gpasswd命令-添加.设置.删除组成员 ? 添加成员时,使用"-a"选项 ? 删除成员时,使用&q

Linux/Centos7账号与权限管理(超详细实例操作)

Linux/Centos7账号与权限管理 管理用户账号.组账号 查询账号信息 设置文件和目录的权限 设置文件和目录的归属 一.前言概述 ? 作为多用户.多任务(Multi-Users,Multi-tasks)的服务器操作系统,Linux提供了严格的权限管理机制,主要从用户身份.文件权限两个方面对资源进行限制.Linux基于用户身份对资源访问进行控制. 用户账号类别: 超级用户--root,权限最高 普通用户--自定义用户 匿名用户(nobody)类似于Windows中的Guest 程序用户--控

理论:账号和权限管理 理论讲解

[TOC] 前言: 账号和权限管理 理论讲解 一:用户账号和组账号概述 1.1:linux基于用户身份对资源访问进行控制 用户账号 超级用户(root,不可被替代) 普通用户(自己创建,取用户名) 程序用户(人无法登录,是给程序使用的,以使程序可以正常运转) 匿名用户(windows的guest,linux的nobody,普通用户中的最低权限用户) 组账号(用户权限的集合) 基本组(私有组,伴随着用户的创建而创建,与用户同名) 附加组(公有组,直接创建一个空组,可以添加已有用户,给组设置相关权限

浅析mysql主从复制中复制用户的权限管理

在用复制账号对mysql salve管理过程中,使用哪些权限合适?首先看一下mysql官方提供的权限表: 权限 列 上下文 CREATE Create_priv 数据库.表或索引 DROP Drop_priv 数据库或表 GRANT OPTION Grant_priv 数据库.表或保存的程序 REFERENCES References_priv 数据库或表 ALTER Alter_priv 表 DELETE Delete_priv 表 INDEX Index_priv 表 INSERT Inse

mysql学习笔记(7-用户账号及权限管理)

用户账号及权限管理: 用户账号:'username'@'host' host:此用户访问当前mysql服务器时,允许其通过哪些主机远程创建连接: 表示方式:IP,网络地址.主机名.通配符(%和_): 禁止检查主机名:my.cnf [mysqld] skip_name_resolve = ON 创建用户账号: CREATE  USER   'username'@'host'  [IDENTIFIED BY  'password']; 删除用户账号: DROP USER  'user'@'host'

linux中账号和权限管理

实验要求: 1.建立用户目录 /tech/benet 和 /tech/accp,分别用于存放项目组中的账号的宿主文件夹. 2.添加组账号 项目组两个分别是benet和accp,GID分别为1001和1002 技术组是tech,GID为200 3.添加用户 benet组中包含三个用户kylin tsengia obama,宿主目录均使用/tech/benet/下的同名目录,其中kylin用户账号设置为2013年12月31日后失效. 4.添加用户 accp组中包含两个用户handy cucci,宿主