因爲缺乏耐心 - 我可以總結這個問題爲: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 –