Json 这是利用角色的正确方法吗?

Json 这是利用角色的正确方法吗?,json,postgresql,plpgsql,sql-injection,dynamic-sql,Json,Postgresql,Plpgsql,Sql Injection,Dynamic Sql,在学习了动态查询之后,我试图构建两个基本函数C(reate)R(ead)U(pdate)d(elete) 为了我的数据库,我需要为表/视图重复大量代码。 我想利用角色并在数据库层应用安全性,这样就有了一个只与用户所属角色的可用功能连接和交互的哑UI 我非常感谢高级开发人员社区能够提供的任何建议、批评和纠正 这是我在博士后13年学习道路的延续 我实现这一目标的方法简述如下: 角色 角色所有者 所有数据库、模式、表、函数、序列等。。。属于它 所有人都将撤销这些列出的对象上的所有内容 没有属

在学习了动态查询之后,我试图构建两个基本函数C(reate)R(ead)U(pdate)d(elete) 为了我的数据库,我需要为表/视图重复大量代码。 我想利用角色并在数据库层应用安全性,这样就有了一个只与用户所属角色的可用功能连接和交互的哑UI

我非常感谢高级开发人员社区能够提供的任何建议、批评和纠正

这是我在博士后13年学习道路的延续

我实现这一目标的方法简述如下:

角色

  • 角色所有者

    • 所有数据库、模式、表、函数、序列等。。。属于它
    • 所有人都将撤销这些列出的对象上的所有内容
    • 没有属于此角色的用户/角色
  • 角色登录

    • 仅授予与数据库的连接
  • 角色经理

    • 仅授予包装器函数的子集
  • 角色卖方

    • 仅授予包装器函数的另一个子集
使用者

  • User1-具有登录名和管理员
  • User2-具有登录名和卖家
基函数

这是insert的基本函数

  • 所有者拥有的
  • 每个人都撤销了上面的任何东西
  • 被认为只能由所有者拥有的包装器函数运行
  • 参数1是工作的表,并且总是在包装器处硬编码
  • 参数2是允许操作的列的列表,并且总是在包装器处硬编码
  • 参数3是一个带有键和值的json有效负载,其中一些对函数本身很有价值,其他的根据查询构建中使用的参数2进行验证,其余的则被忽略
包装函数

这是一个特定表或视图的包装函数

  • 所有者拥有的
  • 每个人都撤销了上面的任何东西
  • 经理授予选择权
  • 参数1是用作基本函数中参数3的json有效负载
您可以通过以下方式运行它:

选择public.entity_uuinsert('{“name”:“Richard”,“provider”:true}')

它会给你新的身份证

实体插入 158


我不认为这样调用函数比直接发出SQL语句更简单或更有效。Hello@LaurenzAlbe,也许insert不是最好的例子,它对更新和列表更有用。在UI方面,我只需要填充json,而不用担心参数和类型的特定查询。我希望db的所有修改都通过这些基本函数,以便在那里应用审计。在你自己开发这一功能之前,你应该查看PostgREST和Postgraphile,看看它们是否能满足你的需要。你好@Jeremy,谢谢你的评论。我做这个小项目是为了学习PgPL和GTK。我打算构建一个没有中间件的小型企业客户机-服务器gnu应用程序。
CREATE FUNCTION public.crud__insert (IN _tbl text, IN _cols text[], IN _opts json, OUT _id int)
    LANGUAGE plpgsql STRICT AS
$$
DECLARE
BEGIN
    EXECUTE (
        SELECT concat('INSERT INTO '
                , _tbl
                , '('
                , string_agg(e.key, ', ' ORDER BY ord)
                , ') VALUES ('
                , string_agg(format('%L', e.val), ', ' ORDER BY ord)
                , ') RETURNING id'
        )
    FROM json_each_text(_opts) WITH ORDINALITY e(key, val, ord)
        WHERE e.key = ANY(_cols)
    ) INTO _id;
END;
$$;
CREATE FUNCTION public.entity__insert (IN _opts json, OUT _id int)
    LANGUAGE sql STRICT SECURITY DEFINER AS
$$
    SELECT public.crud__insert(
        'public.entity',
        ARRAY['name', 'provider', 'customer'],
        _opts
    );
$$;