安装Mysql时会自动安装一个名为mysql的数据库。这个数据库下面存储的是权限表

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| mysql |
| test |
+--------------------+

Mysql会根据这些权限表的内容为每个用户赋予相应的权限
所以我们也是通过这些表来实现管理用户和权限的

use mysql;
show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+

user表

1. user表的作用相当与mysql工作流程中的"用户管理模块",它决定着我们对一个连接允许或拒绝

2. user表用于记录允许连接到服务器的用户帐号信息,里面的对于数据库的权限是全局生效的

3. 根据user表结构,表的字段可以分为4类
(1) 用户列

  • Host          主机名   ——>如果想要从别的机器来登入数据库,Host可以设成 % 
  • User          用户名
  • Password  密码

用户登录时,首先要判断这三个字段是否匹配,匹配则允许登录;

用户创建时,也是设置这三个字段的值;

修改用户密码时,实际也是修改了user表的Password字段的值。

(2) 权限列(以priv结尾的)

  • Grant_priv         是否有Grant权限
  • Shutdown_priv  是否有停止mysql服务的权限
  • Super_priv        是否有超级权限
  • Execute_priv    是否有执行存储过程和函数的权限

包含普通权限:查询权限、修改权限等 操作数据库的动作;

包含高级管理权限:关闭服务权限、超级权限、加载用户等 管理数据库的动作;

这些字段只有N和Y两个选项,为安全起见默认值都设为N;

对这些权限的管理可以使用GRANT语句、也可以通过UPDATE user表的这些列来实现。

(3) 安全列

ssl用于加密,不过一般的发行版本并不支持ssl

mysql> show variables LIKE'have_openssl';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED | ——>DISABLED表示没有支持ssl加密功能
+---------------+----------+
1 row in set (0.03 sec)

x509标准可以用来标识用户

(4) 资源控制列

  • max_questions    每小时允许执行多少次查询
  • max_updates       每小时允许执行多少次更新
  • max_connections 每小时允许建立多少连接
  • max_user_connections 单个用户可以同时具有的连接数

这些字段默认值为0,表示没有限制

desc user;
+------------------------+-----------------------------------+------+-----+----
| Field | Type | Null | Key | Default   | Extra |
+------------------------+-----------------------------------+------+-----+---
| Host | char(60) | NO | PRI |                | |
| User | char(16) | NO | PRI |               | |
| Password | char(41) | NO | |               | |
| Select_priv | enum('N','Y') | NO | | N               | |
| Insert_priv | enum('N','Y') | NO | | N                | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | YES | | mysql_native_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
+------------------------+-----------------------------------+------+-----+----------------

db表

1. 用户被允许连接了,但是是不是可以就能操作所有数据库了呢?

2. 所以我们需要db表/host表,用来规定某一个用户对一个数据库的权限

3. db表的字段分为两类:
(1)用户列

  • Host   主机名
  • Db      数据库名
  • User   用户名

(2)权限列

用户是先根据user表的内容获得权限,再根据db表的内容获取权限

例如,user表中某用户的Select_priv字段为‘N’,表示所有数据库中的表它都无权查询

但db表中这一用户对student表的Select_priv字段设为了‘Y’,表示它只有查询student表的权限

desc db;
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
+-----------------------+---------------+------+-----+---------+-------+

tables_priv表和columns_priv表

1. 同理,即便用户有权对某一数据库操作,那么是不是对所有表都可以操作?对表中的所有记录都可以操作?
2. tables_priv表用来对单个表进行权限设置
3. columns_priv表用来对单条记录(列)进行权限设置
4. 其包含的字段主要有:

  • Host                 主机名
  • Db                    数据库名
  • User                 用户名
  • Table_name     表名
  • column_name  表示可以对哪些数据列进行操作
  • Table_priv        对表进行操作的权限(select,insert,update,delete,create,drop,grant,references,index,alter)
  • Column_priv    对记录进行操作的权限(select,insert,update,references)
  • Timestamp       修改权限的时间
  • Grantor             权限的设置者
mysql> desc tables_priv;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Grantor | char(77) | NO | MUL | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO | | | |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.01 sec)
mysql> desc columns_priv;
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Column_name | char(64) | NO | PRI | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.00 sec)

procs_priv表

1. 对存储过程和存储函数进行权限设置

2. 主要字段:

  • Host                 主机名
  • Db                    数据库名
  • User                 用户名
  • Routine_name 存储过程/存储函数的名字
  • Routine_type   标识它是FUNCTION(存储函数)还是PROCEDURE(存储过程)
  • Proc_priv         拥有的权限(Execute、Alter Routine、Grant)
  • Timestamp       更新的时间
  • Grantor            权限是谁设置的
mysql> desc procs_priv;
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Routine_name | char(64) | NO | PRI | | |
| Routine_type | enum('FUNCTION','PROCEDURE') | NO | PRI | NULL | |
| Grantor | char(77) | NO | MUL | | |
| Proc_priv | set('Execute','Alter Routine','Grant') | NO | | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.00 sec)

用户的权限分配规则

(1)Mysql的权限分配是按照user表--->db表--->tables_priv表--->columns_priv表的顺序进行分配的
(2)如果user表中某一权限的值为Y,就不需要检查往后的表了
(3)如果user表中某一权限的值为N,则依次往后检查每一张表

Mysql的各种权限

 

权限管理操作

1. 授权

Methods-1

> grant            [权限list]                      ——> 参考上表
   on                 [datebase-name.table-name]
   to                  ['username'@'hostname']

identified by  ['password']                  ——> 如果是新创建的用户可以设置密码
   with               [options];                      ——> with关键字之后有5个可选项

options:
  grant option:表示被授权的用户可以将这些权限赋予给别的用户
  max_queries_per_hour [count]:设置每小时可以允许执行count次查询
  max_updates_per_hour [count]:设置每小时可以允许执行count次更新
  max_connections_per_hour [count]:设置每小时可以建立count连接
  max_user_connections [count]:设置单个用户可以同时具有的count个连接数

Methods-2 授予一个用户全部权限

> grant   all privileges  on  [database-name.table-name]  to  'username'@'hostname'  with grant option;

2. 查看权限

Methods-1

  > show  grants  for  'hostname'@'hostname' \G

Methods-2  

  > select  *  from  mysql.user  where  User='username'  and  Host='hostname' \G

3. 取消权限

> revoke  [权限list]
   on         [datebase-name.table.name]
   from      ['username'@'hostname'];

取消全部权限:

> revoke all privileges,grant option
   from     'username'@'hostname';

4. 刷新(加载)权限

> flush privileges;

Mysql——权限管理的更多相关文章

  1. mysql 权限管理 目录

    mysql 权限管理介绍 mysql 权限管理 记录 mysql 权限管理 grant 命令 mysql 权限管理 revoke 回收权限 命令 mysql 权限管理 针对库 授权 db.* mysq ...

  2. mysql权限管理命令示例

    mysql权限管理命令示例 grant all privileges on *.* to *.* identified by 'hwalk1'; flush privileges; insert in ...

  3. mysql 权限管理介绍

    mysql权限管理 就是对控制用户对库.对表的权限.对表中字段权限 权限管理分步 1.创建账号 创建账号有本地账号和远程账号 本地账号 本地账号只能在mysql服务端机器做操作 '; # mysql ...

  4. MySQL权限管理、配置文件(三)

    一.MySQL权限管理 GRANT 权限 ON 授权范围 TO '用户名'@'允许的ip(所有%)' IDENTIFIED BY '用户密码'; 权限:参加下表,一般常用的是CREATE.DELETE ...

  5. mysql权限管理

    经常遇到有网友在QQ群或者论坛上问关于mysql权限的问题,今天抽空总结一下关于这几年使用MYSQL的时候关于MYSQL数据库的权限管理的经验,也希望能对使用mysql的网友有所帮助! 一.MYSQL ...

  6. mysql 权限管理

     参考:    http://www.cnblogs.com/Richardzhu/p/3318595.html 一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内 ...

  7. python之路--MySQL权限管理 数据备份还原

    一 权限管理 mysql最高管理者是root用户, 这个一般掌握在公司DBA手里, 当你想去对数据库进行一些操作的时候,需要DBA授权给你. 1. 对新用户增删改 1. 创建用户 # 要先use my ...

  8. MySQL权限管理分配

    之前一直忽视了MySQL的权限这一块的内容,以为一般般的知识点,随时用随时学就好了,导致自己这方面稍微有点不太明白的地方,总是踩坑,所以后来就总结一下: 1.MySQL权限系统的工作原理 .对连接的用 ...

  9. 数据库——MySQL——权限管理

    关于MySQL的权限管理,可以理解为是MySQL运行你做的事情.比如MySQL允许你执行select操作那么你就不能用update操作.如果你让你在某台机器上连接MySQL,那么你就不能在这个机器以外 ...

随机推荐

  1. Accepted Technical Research Papers and Journal First Papers 【ICSE2016】

    ICSE2016 Accepted Paper Accepted Technical Research Papers and Journal First Papers Co-chairs: Wille ...

  2. Elasticsearch 相关 api 操作

    A. es 操作 1. 检查 es 集群健康状态 2. 获取集群中的节点列表 3. 创建索引 4. 获取索引 5. 索引文档 6. 查询文档 7. 删除索引 8. 更新文档 9. 删除文档 10. 批 ...

  3. 解决Redis/Codis Connection with master lost(复制超时)问题

    今天在线上环境中遇到了codis-server报警,按照常规处理流程进行处理,报错步骤如下: 首先将codis-slave的rdb文件移除,并重启codis-slave 在codis-dashbord ...

  4. MVC4 项目开发日志(1)

    最近一直在定义一个功能全面,层次结构分明的框架.一边学习一边应用.

  5. SqlDataReader 结果集 转成 DataTable

    /// <summary> /// SqlDataReader 转成 DataTable /// 源需要是结果集 /// </summary> /// <param na ...

  6. Day 28面向对象的进阶-内置函数(__new__,__del__)

     元类 创造 类  所有类的type 都是他的元类 类创造 对象   具体创造对象的方法 __new__方法 class 类名(classmata = type)#默认是 class 类名(class ...

  7. JSOI2010 满汉全席

    题目链接:戳我 一个2-SAT的模板题. (什么是2-SAT呢?就是解决一个情况两种决策的问题,我们根据"选了其中一个点A就必须选一个点B的原则,从A向B连边.最后判断如果在一个强连通分量里 ...

  8. 华为交换机 查看 ip和mac对应关系

    IPv4: display arp IPv6: display ipv6 neighbors

  9. django 自定义中间件 middleware

    Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...

  10. Spring+Ehcache

    这里记录一下Spring+Ehcache的结合使用 1.添加依赖 <dependency> <groupId>org.springframework</groupId&g ...