首页 > 数据库 >MySql5.6 关于视图访问权限问题记录

MySql5.6 关于视图访问权限问题记录

时间:2024-05-16 18:09:11浏览次数:25  
标签:root MySql5.6 52.170 视图 172.26 权限 zstack localhost view

问题描述

使用 zstack或root账号访问视图 view3 出现

[root@172-26-52-170 mariadb]# mysql -uzstack -pzstack.password zstack -e "select * from view3"
ERROR 1045 (28000) at line 1: Access denied for user 'zstack'@'localhost' (using password: YES)
[root@172-26-52-170 mariadb]# mysql -uroot -pzstack.mysql.password zstack -e "select * from view3"
ERROR 1449 (HY000) at line 1: The user specified as a definer ('zstack'@'%') does not exist

我限定了zstack用户 只能使用172.26.52.170,localhost,127.0.0.1 访问。

MariaDB [zstack]> select user, host from mysql.user order by user;
+-------------+---------------+
| user        | host          |
+-------------+---------------+
| root        | localhost     |
| root        | 127.0.0.1     |
| root        | ::1           |
| root        | %             |
| root        | 172.26.52.170 |
| zops        | localhost     |
| zops        | %             |
| zstack      | 172.26.52.170 |
| zstack      | localhost     |
| zstack      | 127.0.0.1     |
| zstack_rest | %             |
| zstack_ui   | localhost     |
| zstack_ui   | 172.26.52.170 |
| zstack_ui   | 127.0.0.1     |
+-------------+---------------+

同时我在修改限定前创建了一个视图 view3,然后 definer 是 zstack@%

MariaDB [zstack]> select table_name, definer from information_schema.VIEWS;
+-----------------------------------+--------------------+
| table_name                        | definer            |
+-----------------------------------+--------------------+
| BackupStorageVO                   | [email protected] |
| CdpPolicyVO                       | [email protected] |
| CephOsdGroupHistoricalUsageVO     | [email protected] |
| ClusterVO                         | [email protected] |
| DiskOfferingVO                    | [email protected] |
| HostVO                            | [email protected] |
| ImageVO                           | [email protected] |
| InstanceOfferingVO                | [email protected] |
| IpRangeVO                         | [email protected] |
| L2NetworkVO                       | [email protected] |
| L3NetworkVO                       | [email protected] |
| LocalStorageHostHistoricalUsageVO | [email protected] |
| PrimaryStorageHistoricalUsageVO   | [email protected] |
| PrimaryStorageVO                  | [email protected] |
| ScsiLunVO                         | [email protected] |
| VmInstanceVO                      | [email protected] |
| VolumeSnapshotTreeVO              | [email protected] |
| VolumeSnapshotVO                  | [email protected] |
| VolumeVO                          | [email protected] |
| ZoneVO                            | [email protected] |
| view3                             | zstack@%           |
+-----------------------------------+--------------------+
21 rows in set (0.015 sec)

解决方案

重新创建视图并且指定 definer 。
手段很多比如
https://stackoverflow.com/questions/10169960/mysql-error-1449-the-user-specified-as-a-definer-does-not-exist
https://forums.mysql.com/read.php?10,429197,429197#msg-429197
https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html
差不多都是一个意思,然后我遇到的情况有点特殊因为要批量修改以前所有view 的 definer
我写了个存储过程来重新创建 view

CREATE PROCEDURE zstack.alterViewDefiner()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE view_name VARCHAR(256);
    DECLARE view_def LONGTEXT;

    DECLARE cur CURSOR FOR SELECT TABLE_NAME, VIEW_DEFINITION FROM information_schema.VIEWS WHERE DEFINER = 'zstack@%';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO view_name, view_def;

        IF done THEN
            LEAVE read_loop;
        END IF;
      
        SET @sql = CONCAT('CREATE OR REPLACE VIEW ', view_name, ' AS ', view_def, ';');
        -- 我开始是准备这么写的直接指定definer 但是这样语句执行不了,遂放弃。不指定因为是 root 账号执行 definer 会是 root@% 没搞明白怎么才是 root@ip 的形式
        -- SET @sql = CONCAT('CREATE OR REPLACE DEFINER = 'root'@'localhost' VIEW ', view_name, ' AS ', view_def, ';');
        -- SELECT @sql AS Generated_SQL;

        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

    END LOOP;

    CLOSE cur;
END

没搞懂的问题

  1. 明明 zstack@localhost 是有所有访问权限的。仅仅因为 mysql.user 表中 zstack@% 被删除 搞得无论是root 还是 zstack 都无法访问 view3 是我真的不能理解的。
  2. mysql 真的好难用,view 不能直接修改 definer。存储过程中重新创建 view 也不能指定definer
  3. 然后 view3 的 definer 设置为 root@%,root 和 zstack 账号就都能访问了。也没找到说法
MariaDB [zstack]> SHOW GRANTS FOR 'zstack'@'localhost'\G;
*************************** 1. row ***************************
Grants for zstack@localhost: GRANT USAGE ON *.* TO `zstack`@`localhost` IDENTIFIED BY PASSWORD '*0EE5DC1F2BF5512284EDB05976CDD8BE4CFBD348'
*************************** 2. row ***************************
Grants for zstack@localhost: GRANT ALL PRIVILEGES ON `zstack`.* TO `zstack`@`localhost`
*************************** 3. row ***************************
Grants for zstack@localhost: GRANT ALL PRIVILEGES ON `zstack_rest`.* TO `zstack`@`localhost`
3 rows in set (0.000 sec)

ERROR: No query specified

标签:root,MySql5.6,52.170,视图,172.26,权限,zstack,localhost,view
From: https://www.cnblogs.com/linma/p/18196429

相关文章

  • Linux基础-文件特殊权限
    #day13今日安排默写昨日作业讲解文件权限篇综合知识脑图特殊权限(了解)linux提供的12个特殊权限默认的9位权限rwxrwxrwx还有三个隐藏的特殊权限,如下suid比如/usr/bin/passwdsgidsbit特殊权限对照表类别suidsgidsticky字符表示......
  • Nsight compute权限访问受阻问题
    在非root或sudoer用户下进行ncu命令分析cuda程序时,会报错RR_NVGPUCTRPERMTheuserrunning<tool_name/application_name>doesnothavepermissiontoaccessNVIDIAGPUPerformanceCountersonthetargetdevice.此时可以选择申请root权限或在docker内进行性能分析,目前还......
  • window下通过管理权限启动cmd创建快捷方式
     cmd创建快捷方式命令在Windows管理权限启动命令提示符(cmd)中,可以使用mklink命令来创建快捷方式。基本语法如下: mklink[/D]LinkTarget其中:Link 是你想创建的快捷方式的路径。Target 是你想创建快捷方式指向的文件或文件夹的路径。/D 参数......
  • drf之视图类
    drf视图组件类一、两个视图基类【1】继承APIView+序列化类+Response写接口views视图层classBookView(APIView):defget(self,request):book_list=Book.objects.all()ser=BookSerializer(book_list,many=True)returnResponse(ser.da......
  • 04认证和权限
    认证和权限一、认证在开发后端的API时,不同的功能会有不同的限制,例如:无需认证,就可以访问并获取数据。需认证,用户需先登录,后续发送请求需携带登录时发放的凭证在drf中也给我们提供了认证组件,帮助我们快速实现认证相关的功能【1】认证组件使用步骤(1)创建认证组件类#引入......
  • MySQL 给用户添加 ALTER VIEW 的权限
    本文分享自华为云社区《MySQL给用户添加ALTERVIEW的权限》,作者:皮牙子抓饭。MySQL是一个广泛使用的关系型数据库管理系统,用于许多Web应用程序和企业级解决方案中。在MySQL中,用户权限的管理是非常重要的,以确保数据库安全性和数据完整性。在某些情况下,需要为用户添加特定......
  • openGauss 无权限角色导出数据
    无权限角色导出数据gs_dump和gs_dumpall通过-U指定执行导出的用户帐户。如果当前使用的帐户不具备导出所要求的权限时,会无法导出数据。此时,需先将具有权限的角色赋权给无权限角色,然后在导出命令中设置--role参数来指定具备权限的角色。在执行命令后,gs_dump和gs_dumpall会使用--ro......
  • React基于RBAC的权限控制
    简单实现基于RBAC(Role-BasedAccessControl,基于角色的访问控制)的权限控制,可以通过定义角色和权限,然后将权限分配给不同的角色来实现。用户根据其角色获得相应的权限,进而访问特定的路由、页面组件或者操作。以下是在React应用中实现RBAC的一个简单示例。这个示例包括了路由保护......
  • NumPy 数组复制与视图详解
    NumPy数组的复制与视图NumPy数组的复制和视图是两种不同的方式来创建新数组,它们之间存在着重要的区别。复制复制会创建一个包含原始数组相同元素的新数组,但这两个数组拥有独立的内存空间。这意味着对复制进行的任何更改都不会影响原始数组,反之亦然。创建副本可以使用以下方......
  • vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
    一、是什么权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源而前端权限归根结底是请求的发起权,请求的发起可能有下面两种形式触发页面加载触发页面上的按钮点击触发总的来说,所有的请求发起都触发自前端路由或视图所以我们可以从这两方面入手......