使用Access ODBC链接表进行PostgreSQL授权

时间:2015-10-13 07:42:26

标签: postgresql ms-access authorization plpgsql linked-tables

对于不耐烦的人 - 我可以总结这个问题:

  

可以使用哪种实用方法来利用基于角色的权限   在PostgreSQL中使用使用ODBC链接表的Access前端时?

现在是更长的版本:

我继承了将Access 2000 / PG 7应用程序升级到Access 2013 / PG 9的令人讨厌的任务。我是PostgreSQL的新手,但已经使用了Oracle和Microsoft Access。
编辑:生产服务器在Mac OS X Lion上运行PostgreSQL。我的测试机器在Oracle Linux 7上运行PostgreSQL。

此Access DB通过ODBC链接到PG数据库中的表,使用单个PG登录角色( application_user )进行连接。每个用户都与此登录角色连接,并且只有Forms / VBA中的条件限制了用户的权限。但是,如果用户可以进入导航窗格 - 他们可以直接访问链接表并绕过所有安全限制。在升级此数据库时,我想看看我是否可以收紧这个数据库。

我可以在PostgreSQL上为每个用户设置自己的登录角色,但这意味着(从我看待它的方式)大量重组数据库。我不希望在生产数据库上进行如此大的更改 - 更需要增量更改。

考虑数据库的安全需求 - 我只能想到需要的五个角色。

  • 订单录入
  • 客户条目
  • 订单和客户输入
  • 只读
  • 未授权 - 无法访问

我可以在PGSQL中将这些设置为组角色,并为每个角色设置必要的ACL。

我缺少的是如何从单个登录角色( application_user )转到上述所有角色?

我最初的想法是将 application_user (登录角色)设置为没有组角色(基本上导致"未授权 - 无访问权限" ),然后使用对PL / pgSQL函数 authorize(Username, MD5PassWord) 的调用来授权和提升角色。该函数将检查提供的MD5哈希是否与存储在users表中的MD5哈希相匹配 - 如果是 - 它将为相应的组角色发出SET SESSION ROLE。 如果这可行,它将让我跟踪登录的用户名,然后使用 pg_backend_pid() 功能,我可以将其与用户关联,以用于业务逻辑或日志记录或随你。这也意味着如果某些用户进入链接表,我不必担心 - 因为他们的访问权限将受到他们当前在该数据库会话中授权的任何角色的限制。

所以我制作了一个plpgsql脚本,将其所有者设置为OrderCustomerEntryGroup并赋予SECURITY DEFINER权限。

DECLARE
    v_Status integer;
BEGIN
    v_Status := 0;
    IF pin_username = 'username' AND MD5('foo') = pin_pwmd5 THEN
      SET SESSION AUTHORIZATION OrderEntryGroup;
      v_Status := 1;
    END IF;
    RETURN v_Status;
END;

但是我的实现只有问题

SELECT authenticate('username',MD5('foo'));

给出:

ERROR: cannot set parameter "session_authorization" within security-definer function
SQL state: 42501
Context: SQL statement "SET SESSION AUTHORIZATION OrderEntryGroup"
PL/pgSQL function authenticate(character varying,text) line 7 at SQL statement

所以我读到了这一点 - 从我所知道的,你曾经能够做到这一点,但无论出于什么原因它被删除了。除了在每个用户级别使用内置角色之外,我还没有找到替代方案。

所以我要问的是...... 我缺少什么让我的方法(一个简单的解决方案)工作,或者有更好的方法这样做不会破坏现有的访问数据库吗?

1 个答案:

答案 0 :(得分:3)

如果要限制从直接连接访问数据库,则无论如何都需要在后端进行一定数量的“重组”。最好的方法几乎总是让每个用户使用自己的凭据进行连接,然后根据用户在数据库中所属的组(有时称为“角色”)来限制用户可以执行的操作。

如果您想避免为每个网络用户设置单独的数据库用户ID /密码,那么您应该使用集成Windows身份验证(SSPI)进行调查,如另一个问题here中所述。您仍然需要在数据库级别定义用户(除了组/角色),但无论如何您都必须完成大部分工作。