因为缺乏耐心 - 我可以总结这个问题为:PostgreSQL的授权与访问ODBC链接表
什么实用的方法可以使用Access前端时,可以使用能够充分利用基于角色的权限在PostgreSQL中 那采用ODBC链接表?
现在对于更长的版本:
我继承升级的Access 2000/PG 7应用程序访问2013/PG 9.我是新来的PostgreSQL,但已经使用的令人讨厌的任务Oracle和Microsoft Access相当多。
编辑:生产服务器在Mac OS X Lion上运行PostgreSQL。我的测试机是通过ODBC在Oracle Linux的7
这个Access数据库是连接运行的PostgreSQL在PG数据库表,使用单PG登录角色(application_user
)连接。每个用户都与这个登录角色连接,并且只有Forms/VBA中的条件限制了用户的权限。但是,如果用户可以进入导航窗格 - 他们可以直接访问链接表并绕过所有安全限制。在升级这个数据库时,我想看看我是否可以收紧这个数据库。
我可以在PostgreSQL上为每个用户设置自己的登录角色,但这意味着(从我看待它的方式)大量重新编译数据库。我宁愿不在生产数据库上进行如此大的更改 - 更需要增量更改。看看数据库的安全需求 - 我只能想到将需要的五个角色。
- 订单录入
- 客户准入
- 订单和客户准入
- 只读
- 没有获得许可 - 禁止访问
我可以设置这些在PGSQL组角色并为每个角色提供必要的ACL。
我缺少的是我如何从单一的登录角色(application_user
)到所有上述角色?
我最初的想法是设置application_user
(登录角色)有没有组的角色(主要是导致“未授权 - 禁止访问”),然后用调用一个PL/pgSQL函数authorize(Username, MD5PassWord)
授权并提升角色。该函数将检查提供的MD5哈希是否与用户表中存储的MD5哈希相匹配 - 如果是这样 - 它将为适当的组角色发出SET SESSION ROLE
。
如果这可行,它可以让我跟踪登录的用户名,然后使用功能,我可以将它与用户关联起来,用于业务逻辑或日志记录等。这也意味着我不必担心一些用户是否进入链接表 - 因为他们的访问将受到当前在该数据库会话中授权的角色的限制。
所以我掀起了一个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
所以我在这读了 - 从我可以告诉,你以前可以要做到这一点,但无论出于何种原因它被删除。除了在每个用户级别使用内置角色之外,我一直无法找到替代方案。
那么,我问的是...我缺少的是让我的方式(一个简单的解决方案)的工作,还是有不会涉及翻录除了这样做的更好的方式存在访问数据库?
诚然,我不熟悉SSPI,但我要指出,生产数据库在Mac OS X Lion的(而不是服务器)和运行我的测试数据库是在Oracle的Linux 7上运行我看着PostgreSQL的认证模块决定我宁愿不引入另一层让我支持 - 而是坚持使用用户名/密码。在数据库服务器上设置每个用户并不是什么大问题。如何动态更改访问数据库中的凭据,而不会将它们保存在连接字符串中? – DHW
@DHW我刚刚使用PostgreSQL ODBC v9.x进行了测试,它似乎缓存了像SQL Server那样的证书(和MySQL,IIRC,没有)。在这种情况下,您的用户将能够进入他们的PostgreSQL用户名和密码,一旦当你访问应用程序首次尝试打开一个PostgreSQL链接表,之后将继续使用缓存的凭据,只要你访问的应用程序是开放的。用这种方法做一些测试(因为我的PostgreSQL服务器是在Windows上,而不是在Linux/Mac上),如果它适合你,那么你将不必在连接字符串中保存凭据。 –
不存储登录在连接字符串中,所以你不必重新链接与不同的用户,看到这个提示: http://blogs.office.com/b/microsoft-access/archive/2011/04 /08/power-tip-improve-the-security-of-database-connections.aspx –