zoukankan      html  css  js  c++  java
  • 说说MySQL权限

    前言

      今天继续MySQL系列文章,讲讲MySQL权限相关的内容。我们都知道,在写系统的时候,都会有权限相关的服务,以达到权限控制的目的。以最简单的权限菜单为例: 管理员拥有最大权限,可以查看系统下所有菜单。操作员只拥有部分菜单权限。同样的,在MySQL数据库中也有相应的权限管理。例如:数据库连接权限,新增,修改,查询权限等等。下面我们就一一揭晓MySQL权限的真实面貌。

    授权方式

      在讲 MySQL 权限之前,我们不得不先熟悉下MySQL中常见的两种授权方式。

    姑且称为:授权法 和 改表法 吧。

    1. 授权法  

    标准语法如下:

    grant all on db_name.table_name to 'user_name'@'host_name';

    其中:

    1. grant 为MySQL关键字。

    2. all 表示所有权限,也可以授予部分权限,如select,insert,update,create,drop等等。

    3. db_name 表示数据库名。其中:* 表示该数据库实例中的所有数据库。

    4. table_name 为db_name数据库中的表名。其中:* 表示db_name数据库中的所有表。

    5. user_name 表示数据库服务器中已经存在的用户名。

    6. host_name 表示允许连接的主机。(localhost / 127.0.0.1 表示本机,% 表示任何主机,也可以用域名表示。)

    以设置root用户允许远程连接为例:

    给 root 用户设置该实例上所有数据库的所有权限,且允许其通过任意主机连接该实例。则可以用下述语句表示:

    grant all on *.* to 'root'@'%';

    2. 改表法  

    你一定很好奇,MySQL是如何判断用户是否有某数据库的权限?是否有某表的权限?
    其实呀,在MySQL中是有特定数据结构来存储这部分信息的。我们可以按照下述步骤来找到它,甚至可以来修改它,以达到修改权限的目的。

    1. 首先,我们登录到MySQL服务器。

    2. 进入MySQL服务器中自带的 mysql 数据库中。

    3. 找到 mysql 数据中的 user 表,修改对应用户的信息即可。

    以设置root用户允许远程连接为例:

    use mysql;
    
    update user set host="%" where user="root";
    
    flush privileges;

    执行以上语句后,我们可以通过以下语检查是否生效:

    show grants for 'root'@'%';

    值得注意的是:  

    为了权限验证时的高效性。MySQL在服务启动时,就会将权限数据加载在内存中。因此,授权法 与 改表法 会有以下细微差异:

    1. 我们在使用 grant 命令时,即授权法。其会自动通知MySQL服务器重新加载一次权限数据。以达到即时生效的效果。

    2. 但当我们使用改表法时。是没有通知重新加载权限数据的。因此会导致其不会即时生效。直至服务重启后生效。服务重启,特别是生产环境,那几乎是灾难性的。好在MySQL为我们提供了手动通知的命令。即:flush privilege命令。

    例如:

    mysql> flush privileges;
    Query OK, 0 rows affected (0.01 sec)

    连接权限

       通过上面的介绍,我们现在应该已经知道了MySQL中常见的授权方式。现在就从实际角度来用用。我们都知道在MySQL中默认是不允许root用户远程登录的。我们通过以下命令修改即可:

    grant all on *.* to 'root'@'%';
    1. 如果想设置成通过指定的IP登录,则可以将 %替换成特定的IP即可。

    2. 如果想设置成通过指定的IP段登录,即可以将%替换成192.168.1.%即可。

      (其中: 将192.168.1修改成你想要IP段即可!)

    表权限

      知道了连接权限,我们再来说说表权限。以几种常见的场景为例:

    1. 设置用户 andyqian 在 customer 数据库中的 t_user 表的所有权限。

      grant all on customer.t_user to 'andyqian'@'%';
    2. 设置用户 andyqian 在 customer 数据库中 t_user 表的只读权限。

      grant select on customer.t_user to 'andyqian'@'%';

      当仅仅只设置只读权限时,执行update命令会有如下错误信息:

      mysql> update t_user set name="sansan",updated_at=now() where oid=1;
      ERROR 1142 (42000): UPDATE command denied to user 'andyqian'@'localhost' for table 't_user
    3. 设置用户andyqian在 customer 数据库中 t_user 表的可读可写权限。

      grant select,insert,update on customer.t_user to 'andyqian'@'%';

      当仅仅只设置可读,可写,可修改权限时,执行drop命令会有如下错误信息:

      mysql> drop table t_user;
      ERROR 1142 (42000): DROP command denied to user 'andyqian'@'%' for table 't_user

      列权限

        在某些场景下,我们需要将权限精确到列上。我们也可以使用 grant命令来实现。

    4. 设置指定列的insert权限时:

      grant insert(created_at,updated_at) on customer.t_user to 'andyqian'@'localhost';
    5. ```
      mysql> insert into t_user(name,created_at,updated_at)values('name',now(),now()); 
      ERROR 1143 (42000): INSERT command denied to user 'andyqian'@'localhost' for column 'name' in table 't_user'

      撤销权限

        有添加权限,肯定也少不了撤销权限。其语法与grant基本一致。仅仅只是关键字不同

    6. 撤销 用户 andyqian 对 customer数据库中的t_user表 created_atupdated_at字段的新增权限。

      revoke insert(created_at,updated_at) on customer.t_user from 'andyqian'@'localhost';

    查看用户权限

      上面说到,如果用户执行没有权限的命令时。则会显示错误信息。为了避免这种情况发生。我们可以先通过以下命令来查看当前用户拥有的权限。

    命令: show grants for 'user_name'@'localhost'

    其可以使用current_user()函数来表示当前登录用户。

    例如:

    mysql> show grants for current_user();
    +-----------------------------------------------------------------------+
    | Grants for andyqian@localhost                                         |
    +-----------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'andyqian'@'localhost'                          |
    | GRANT SELECT, INSERT ON `customer`.`t_user` TO 'andyqian'@'localhost' |
    +-----------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    1. 其中第一句: USAGE 表示没有特殊权限的意思。使用 show grants命令查看时,通常会一起显示在结果列表中。

    2. 第二句则表示用户 andyqian 在customer数据库中的t_user表中有select,insert 权限。

    最后

      有很多童鞋会觉得:数据库管理,SQL优化,索引建立等等,都是DBA的事情。开发人员不需要了解。我认为这种认知是错误的,数据库设计本身就是后端工程师工作职责的一部分。DBA 应该是设计的审核者,而不是建立者。

  • 相关阅读:
    ubuntu 9.04更新源
    想学一下asp.net,跟着书本做了个bbs
    [转]ubuntu系统中遇到的一些问题及解决
    第一篇,打个招呼
    人际交往的书籍推荐
    程序员的五层境界,你在哪一层?
    HTTP报文之"请求报文"和"响应报文"详解
    如何提高你的工作效率?
    面对焦虑我们怎么办 ?
    CEO要看的书籍推荐
  • 原文地址:https://www.cnblogs.com/joyny/p/10508935.html
Copyright © 2011-2022 走看看