首页 > 解决方案 > sql中指定的授权

问题描述

我有一个示例商店数据库(AdventureWorks),我想授予每个客户编辑他们自己的销售额。所以看来我不能使用视图,因为必须为每个客户创建视图

标签: sqlpostgresqladventureworks

解决方案


有两种方法:

  1. 像 Aleksandr 这样的观点建议:

    CREATE VIEW myview
    WITH (security_barrier = true) AS
       SELECT ...
       FROM atable
       WHERE customer = current_user
    WITH CHECK OPTION;
    

    此类视图也可以在 PostgreSQL 中修改

  2. 使用行级安全性。一个简单的例子:

    ALTER TABLE atable ENABLE ROW LEVEL SECURITY;
    
    CREATE POLICY xy ON atable
       FOR ALL TO PUBLIC
       USING (customer = current_user)
       WITH CHECK (customer = current_user);
    

您会看到这两个示例都取决于当前的数据库用户。这是最简单的情况。

如果您没有为每个客户提供单独的数据库用户,则需要其他东西来识别数据库中的客户。一种常用的方法是使用数据库参数:应用程序设置类似

SET myapp.user = 'Customer1';  -- or use "application_name"

这样做的缺点是这样的设置可以被用户覆盖,用户可以通过这种方式破坏安全性。如果您想避免这种情况,请编写一个小的 C 扩展来定义一个正确的参数,该参数只能由超级用户设置,或者一旦设置就不能更改。


推荐阅读