博客
关于我
【MySQL】MySQL视图定义者和安全性definer/invoker
阅读量:327 次
发布时间:2019-03-03

本文共 1336 字,大约阅读时间需要 4 分钟。

MySQL数据库用户权限问题及解决方案

在进行MySQL数据库用户权限规范时,经常会遇到一些棘手的问题。以下是一个典型案例的分析和解决方案。

问题背景

在将业务帐号'user'@'%'修改为'user'@'192.168.1.%'时,业务系统出现了404错误。经过排查,发现问题出在某些业务模块调用数据库时使用了视图,而这些视图的定义者是原来的'user'@'%'帐号,并且安全性设置为definer。由于新用户'user'@'192.168.1.%'虽然拥有与原用户相同的数据库权限,但仍然无法使用这些视图。

问题原因

  • 视图权限依赖原定义者:视图的定义者(definer)必须存在且拥有相应权限,才能正常使用。虽然新用户拥有相同的权限,但由于其不再是定义者,无法访问定义者为原用户的视图。
  • 默认安全性设置:默认情况下,MySQL视图的安全性设置为definer,这意味着必须存在定义者用户才能执行视图操作。

解决方案

针对上述问题,采取以下解决方案:

  • 修改所有视图的定义者

    将所有相关视图的定义者更改为新用户'user'@'192.168.1.%'。这样可以确保新用户作为定义者,具备执行视图所需的权限。

  • 调整安全性设置

    将视图的安全性设置从definer改为invoker。这样,执行视图的用户(调用者)将使用其自身权限,而非依赖定义者的权限。这种方法在生产环境中虽然可行,但由于需要确保所有视图的定义者都已修改,因此优先采用第一种方法。

  • definer与invoker的区别

    在MySQL中,definerinvoker是用于定义数据库对象(如视图、存储过程等)的安全性验证方式。两者的主要区别如下:

    • definer

      • 视图执行时,使用定义者的权限。
      • 定义者必须存在且拥有相应权限,否则会导致执行失败。
    • invoker

      • 视图执行时,使用调用者的权限。
      • 只需调用者具备执行权限即可使用。

    definer的作用

    definer主要用于定义数据库对象的安全性验证方式。在创建视图、触发器、函数、存储程序或事件时,通常需要指定SQL SECURITY { DEFINER | INVOKER }。默认情况下,MySQL的安全性设置为DEFINER

    • DEFINER:视图或其他对象执行时,使用定义者用户的权限。
    • INVOKER:视图或其他对象执行时,使用调用用户的权限。

    示例说明

    以存储程序为例:

  • 默认设置

    如果未指定SQL SECURITY,默认为DEFINER,即存储程序将使用定义者的权限执行。

  • INVOKER设置

    存储程序执行时,使用调用用户的权限。如果调用用户没有权限,操作将失败。

  • DEFINER设置

    存储程序执行时,使用定义者的权限。即使调用用户没有权限,仍需定义者用户存在且拥有权限。

  • 注意事项

    在生产环境中,数据库权限变更可能导致服务中断,因此必须谨慎操作。建议:

    • 批量修改:在测试环境中先验证所有视图、触发器等对象的定义者和安全性设置,确保不会影响正常业务。
    • 权限审查:确保所有相关对象的定义者和安全性设置符合当前用户的权限需求。

    参考文献

    你可能感兴趣的文章
    pandas,python - 如何在时间序列中选择特定时间
    查看>>
    Spring 框架之 AOP 原理深度剖析
    查看>>
    Pandas:如何按列元素的组合分组,以指示基于不同列的值的同现?
    查看>>
    Pandas:将一列与数据帧的所有其他列进行比较
    查看>>
    PANDA:基于多列对数据表的行运行计算,并将输出存储在新列中
    查看>>
    PandoraFMS 监控软件 SQL注入漏洞复现
    查看>>
    PandoraFMS 监控软件 任意文件上传漏洞复现
    查看>>
    PanTools多网盘登录神器
    查看>>
    Papyrus项目常见问题解决方案
    查看>>
    Parallel.ForEach使用示例
    查看>>
    Parallel.ForEach的基础使用
    查看>>
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Paramiko exec_命令的实时输出
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>