我正在開發一個grails 1.3.7應用程序,它在設計上就是希望所有用戶都保持在數據庫級別,這樣他就可以利用他的數據庫有關登錄,權限的功能等(數據庫是Oracle 10g)。在GORM中使用不同的數據庫用戶
有沒有一種方法可以配置GORM在用戶登錄時使用不同的用戶/密碼連接到數據庫?就像構建用戶/傳遞表單並將這些憑據傳遞給GORM以連接到數據庫一樣?
實施此場景的最佳做法是什麼?
我正在開發一個grails 1.3.7應用程序,它在設計上就是希望所有用戶都保持在數據庫級別,這樣他就可以利用他的數據庫有關登錄,權限的功能等(數據庫是Oracle 10g)。在GORM中使用不同的數據庫用戶
有沒有一種方法可以配置GORM在用戶登錄時使用不同的用戶/密碼連接到數據庫?就像構建用戶/傳遞表單並將這些憑據傳遞給GORM以連接到數據庫一樣?
實施此場景的最佳做法是什麼?
我不知道Grails,但它使用Hibernate。
什麼,我認爲:
您使用會話工廠與數據庫進行交互,每個會話工廠有一個數據源,其中有db和樂L/P的URL。
因此,您需要爲每個用戶安排一個會話工廠,以便您可以通過不同的身份驗證連接到數據庫。我沒有看到任何更簡單的解決方案。
這意味着您需要使用多個數據庫/模式的多租戶應用程序具有相同的需求。除了你不使用不同的數據庫/模式,只是不同的l/p。
看來你正在尋找的多租戶的插件,在「單租戶模式」: http://www.grails.org/plugin/multi-tenant
單租戶模式 的「數據源」豆成一個AOP代理 轉換是創建爲每個租戶
(最後我錯了,你可以使用一個會話工廠和一個「動態數據源」 ^^)一個新的數據源
編輯:
http://grails.org/Multi-Tenant+Plugin+-+Single+Tenant+Database+Set+Up
的單租戶選項比 多租戶的選擇多了幾分成熟。它繼承了Datasource.groovy中 默認數據源的所有數據源配置,並允許您爲每個租戶提供 自定義數據源url。 這意味着您不能在同一個 實例中混合使用,並且 會匹配不同租戶的驅動程序或用戶/傳遞組合。
看來,最後你不能做到這一點與插件,只改變URL ......正如他們說這是一個有點不成熟,但你或許可以有助於該插件,這樣就能夠還改變用戶/密碼,或者只是檢查他們是如何做到這一點,並開發自己的插件...
...或者也許有人已經開發了... ...
EDIT2:
什麼,你也可以做的是:
1)每次用戶登錄,使用用戶L/P創建一個新的數據源,並把它添加到數據源池(地圖) (當他註銷或會話過期時,刪除該數據源)
2)當您從用戶處獲得請求時,將該用戶的標識放入threadlocal(帶有過濾器的示例)。
3)創建一個新的數據源實現MultiAuthentificationDatasourceImpl,其中您將注入數據源池,並將所有方法映射到您應該使用的數據庫。對於爲例,您的getConnection()方法將是:
public Connection getConnection() {
return getDatasourceToUse().getConnection();
}
public Datasource getDatasourceToUse() {
return datasourcePool.get(getUserIdFromThreadLocal());
}
和幾乎相同的所有方法,你可以重用getDatasourceToUse()方法...
4)請使用MultiAuthentificationDatasourceImpl在你的數據源Grails的配置
但我不知道Grails的,只是它是在Java中可能...
感謝您尋找可能的解決方案,我會使用你的答案來嘗試你爲Grails實現這個,但最後我想我只是與客戶就應用程序的這種設計的缺點進行談判。順便說一句,我沒有-1你的答覆,不知道是誰,我確實發現它有用。 – adrianmoya
另一種解決方案(如果你只有一個數據庫應用程序,並希望使用由DBMS管理的數據庫用戶只爲認證薦)。
您可以使用特定用戶對數據庫進行全局訪問,並編寫一個認證方案,通過用自己的用戶名和密碼創建到數據庫的新連接來驗證用戶身份。
所以,在這種情況下,你必須優點:
不,這不會給他們想要的東西:爲每個用戶的操作記錄日誌,並能夠管理數據庫中不同操作的權限。該要求不僅僅是驗證。 – adrianmoya
我不知道答案,但你將要殺死servlet引擎來池數據源的能力。性能會受到影響,因爲每個請求都需要一個新的專用連接。那裏有很多開銷。如果可能的話,我真的會重新思考或反對這種設計。 – OverZealous
這是真的,我不完全同意這種設計......但正如我所說,你可以打開一個連接,並保持它,爲每一個登錄用戶......它可以幫助,但不會工作正常,如果你有一千用戶...順便說一句,爲什麼-1我的回覆?請至少評論,如果你不同意... –
謝謝你們,我也同意應該重新考慮設計。但是我之前看到過這樣的設計,所以我只是想看看它是如何實現的,所以我可以通過除「這個設計很爛」之外的解釋進行協商。 – adrianmoya