【问题标题】:How to grant a user to perform only a certain function in Tarantool如何授予用户在 Tarantool 中仅执行特定功能
【发布时间】:2023-03-08 12:13:01
【问题描述】:

现在的挑战是:有 2 个函数。并且有一个用户只能执行其中一个。问题是怎么做? 如果你只是写: box.schema.user.grant ('user', 'execute', 'function', 'dima', nil, {if_not_exists = true}) 那么用户 'user' 根本无法连接。将显示一条错误消息:用户 'user' 拒绝执行对 Universe '' 的访问。如何正确提供访问权限?

        box.once("schema", function()
        box.schema.user.create('superuser', {password = '11111111'})
        box.schema.user.create('user', {password = '11111111'})
        box.schema.user.grant('superuser', 'read,write,execute','universe', nil, {if_not_exists = true})
        box.schema.user.grant('user','execute','function','dima',nil, {if_not_exists = true})
        end)
        function reload(proc)
            package.loaded[proc]=nil return require(proc)
                end
        ws = reload('project/init')

函数迪玛:

local obj={}

function obj.open()
    return 'dima'
end

return obj

函数dima2:

local obj={}

function obj.open()
    return 'dima2'
end

return obj

初始化.lua:

obj = {}
  collectgarbage('collect')
  net   = require('net.box')
  fiber = require('fiber')
  uuid  = require('uuid')
  -- modules
  obj.dima  = reload('project/dima')
  obj.dima2 = reload('project/dima2')
return obj

【问题讨论】:

    标签: tarantool


    【解决方案1】:

    为了只允许访问一个功能,您可以执行以下操作:

    box.cfg({listen=3301})
    
    foo = function() print("bar") end
    
    box.schema.user.create('myuser', {if_not_exists=true, password = 'secret'})
    
    -- setuid is required here so that the function, when called by user with
    -- restricted rights, will have access to everything
    box.schema.func.create('foo', {if_not_exists=true, setuid=true})
    
    box.schema.user.grant('myuser', 'execute', 'function', 
                          'foo', {if_not_exists=true})
    

    然后打开一个单独的 tarantool 提示符(不是 tarantoolctl!下面的解释)并输入:

    net_box = require('net.box')
    c = net_box.connect('myuser:secret@localhost:3301')
    c:call('foo')
    

    然后您会在第一个控制台中看到“bar”。

    您看到“用户 'user' 拒绝执行对 Universe '' 的执行访问”的原因是您尝试连接 tarantoolctl,这需要对整个数据库的读取权限。通过 connector 或 net.box 调用就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2018-11-19
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多