Json 这是利用角色的正确方法吗?
在学习了动态查询之后,我试图构建两个基本函数C(reate)R(ead)U(pdate)d(elete) 为了我的数据库,我需要为表/视图重复大量代码。 我想利用角色并在数据库层应用安全性,这样就有了一个只与用户所属角色的可用功能连接和交互的哑UI 我非常感谢高级开发人员社区能够提供的任何建议、批评和纠正 这是我在博士后13年学习道路的延续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年学习道路的延续 我实现这一目标的方法简述如下: 角色 角色所有者 所有数据库、模式、表、函数、序列等。。。属于它 所有人都将撤销这些列出的对象上的所有内容 没有属
- 角色所有者
- 所有数据库、模式、表、函数、序列等。。。属于它
- 所有人都将撤销这些列出的对象上的所有内容
- 没有属于此角色的用户/角色
- 角色登录
- 仅授予与数据库的连接
- 角色经理
- 仅授予包装器函数的子集
- 角色卖方
- 仅授予包装器函数的另一个子集
- User1-具有登录名和管理员
- User2-具有登录名和卖家
- 所有者拥有的
- 每个人都撤销了上面的任何东西
- 被认为只能由所有者拥有的包装器函数运行
- 参数1是工作的表,并且总是在包装器处硬编码
- 参数2是允许操作的列的列表,并且总是在包装器处硬编码
- 参数3是一个带有键和值的json有效负载,其中一些对函数本身很有价值,其他的根据查询构建中使用的参数2进行验证,其余的则被忽略
- 所有者拥有的
- 每个人都撤销了上面的任何东西
- 经理授予选择权
- 参数1是用作基本函数中参数3的json有效负载
我不认为这样调用函数比直接发出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
);
$$;