zoukankan      html  css  js  c++  java
  • Mysql用户权限控制(5.7以上版本)

     

    1.1. 最简单的MySql权限  

    最简单也是最高效的,如果解决新手们删库跑路的问题其实也是很简单的,对于正式库只给一个增删改查的权限,或者只给一个查询权限(是不是就解决了删库的可能性?)

    使用Root用户,执行

    grant SELECT on mall.* TO 'dev'@'192.168.244.%' IDENTIFIED BY '123' WITH GRANT OPTION;

    很简单的一句sql,创建了一个dev的用户,密码为123,仅仅运行在网段为192.168.0.*的网段进行查询操作。

    再执行一条命令

    show grants for 'dev'@'192.168.244.%'

     

    不错,可以链接,也可以执行select,这个时候还想删库?做梦吧~

    1.2. 深入研究下MySQL权限

    1.2.1. 用户标识是什么

    上面一句简单的SQL堪称完美的解决了程序员新手的删库跑路的问题,高兴吧,你学到了新姿势,但是如果想面试给面试管留下好映像,上面的知识好像还不够,有必要好好深入研究下MySql的权限了。

    这里有个小的知识点需要先具备,在mysql中的权限不是单纯的赋予给用户的,而是赋予给用户+IP”的

    比如dev用户是否能登陆,用什么密码登陆,并且能访问什么数据库等都需要加上IP,这样才算一个完整的用户标识,换句话说 'dev'@'192.168.0.168' 'dev'@'127.0.0.1''dev'@'localhost' 3个是完全不同的用户标识(哪怕你本机的ip就是192.168.0.168)。

    1.2.2. 用户权限所涉及的表

    有了用户标识的概念接下来就可以看权限涉及的表了,这也是面试的时候加分项哦。

    有几张表你可以好好的记记的,mysql.usermysql.dbmysql.table_privmysql_column_priv

    你可以熟悉其中的user表,甚至手动的改过里面的数据(不合规范哦!)

    那这些表有什么用,和权限又有什么关系呢?

    l User的一行记录代表一个用户标识

    l db的一行记录代表对数据库的权限

    l table_priv的一行记录代表对表的权限

    l column_priv的一行记录代表对某一列的权限

    新建一个表account

    DROP TABLE IF EXISTS `account`;

    CREATE TABLE `account` (

      `id` int(11) NOT NULL,

      `name` varchar(50) DEFAULT NULL,

      `balance` int(255) DEFAULT NULL,

      PRIMARY KEY (`id`),

      KEY `idx_balance` (`balance`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    INSERT INTO `account` VALUES ('1', 'lilei', '900');

    INSERT INTO `account` VALUES ('2', 'hanmei', '100');

    INSERT INTO `account` VALUES ('3', 'lucy', '250');

    INSERT INTO `account` VALUES ('5', 'tom', '0');

    很诧异吧,mysql其实权限并不事特别low,权限的粒度甚至到了某一列上,举例来说,有个表account

    对于前面创建的dev用户我不想让他访问balance,但是idname列是可以访问的,这样的需求在工作中不是没有。

    grant select(id,name) on mall.account to 'dev'@'192.168.244.%';

    这时候可以在分别看下table_privcolumn_priv的数据

    这个就应该豁然开朗了吧

    REVOKE SELECT on mall.* from 'dev'@'192.168.244.%'

    你使用dev登陆查询试试

    你再要查询所有记录?不好意思不让查

    而你查询idname查询又是可以了。

     

      

    1.2.3. Mysql的角色

    1.2.3.1.  准备工作

      MySql基于用户+IP”的这种授权模式其实还是挺好用的,但如果你使用OraclePostgreSQLSqlServer你可能会发牢骚

    这样对于每个用户都要赋权的方式是不是太麻烦了,如果我用户多呢?有没有角色或者用户组这样的功能呢?

    好吧,你搓中了mysql的软肋,很痛,在mysql5.7开始才正式支持这个功能,而且连mysql官方把它叫做“Role Like”(不是角色,长得比较像而已,额~~~)?

    好咧,那在5.7中怎么玩这个不像角色的角色呢?

    show variables like "%proxy%"

     

    你得先把check_proxy_usersmysql_native_password_proxy_users这两个变量设置成true才行

    set GLOBAL check_proxy_users =1;

    set GLOBAL mysql_native_password_proxy_users = 1;

    当然,你也可以把这两个配置设置到my.cnf

    1.2.3.2. 创建一个角色

    create USER 'dev_role'

    可能被你发现了,我这里创建得是个user,为了稍微像角色一点点,我给这user取名叫dev_role,而且为了方便也没用使用密码了。

    1.2.3.3. 创建2个开发人员账号:

    create USER 'deer'

    create USER 'enjoy'

    这两个用户我也没设置密码

    1.2.3.4. 把两个用户加到组里面

    grant proxy on 'dev_role' to  'deer'

    grant proxy on 'dev_role' to  'enjoy'

    可以看下其中一个用户的权限

     

    这里有个小的地方需要注意:如果你是远程链接,你可能会收获一个大大的错误,你没有权限做这一步,这个时候你需要再服务器上执行一条

     GRANT PROXY ON ''@'' TO 'root'@'%' WITH GRANT OPTION;

    1.2.3.5. 给角色dev_role应该有的权限

     有了用户了,这用户也归属到了dev_role这角色下面,那接下来要做的就很简单了,根据业务需求给这角色设置权限就好了

    grant select(id,name) on mall.account to 'dev_role'

    1.2.3.6. 测试

     好咧,大功告成,现在使用'deer'用户登陆系统试试

    select id ,name from mall.account

    你可能又会问,这种角色的权限是存哪的呢?

    给你看表

     

  • 相关阅读:
    Path Sum II
    Convert Sorted Array to Binary Search Tree
    Construct Binary Tree from Inorder and Postorder Traversal
    Construct Binary Tree from Preorder and Inorder Traversal
    Maximum Depth of Binary Tree
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Same Tree
    Validate Binary Search Tree
    Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/Soy-technology/p/11037481.html
Copyright © 2011-2022 走看看