2011-09-23 79 views
0

我正在使用Grails多租戶插件和單租戶模式。我使用了spring security core插件進行身份驗證。我使用了域名解析器。用戶表在默認數據庫中不常見。每個租戶數據庫都有它自己的用戶表。它工作正常,除了以下兩個問題。Grails多租戶和Spring Security核心插件

  1. 當客戶端(租戶)用戶嘗試登錄時,有時會遇到默認數據庫並說'用戶未找到'。如果我在刷新頁面後嘗試(輸入url並按CTRL + F5),它會正確登錄。

  2. 我在擁有不同訪問權限的租戶中擁有共同用戶。首先,我在帶有一個租戶URL的瀏覽器中打開我的應用程序,使用憑證登錄併成功登錄。接下來,我在同一瀏覽器中打開另一個選項卡,輸入第二個url和登錄憑據。在這裏,我可以登錄到應用程序,但我獲得了第一位租戶的權限。如果我按照提到的方式註銷並刷新頁面,或者如果我在登錄之前刷新頁面並嘗試,它就可以正常工作。

當我調試時,我發現在解決租戶問題之前,spring security會使用前面的db會話命中數據庫。

我該如何解決這個問題?

回答

1

當請求打我的登錄頁面,我得到的tenantId,並保持它在會話

Integer tenantId = tenantResolver?.getTenantFromRequest(request) 
if (session.tenantId == null) { 
    session.tenantId = tenantId 
} 

要獲取登錄的用戶的詳細信息,我通過實施GrailsUserDetailsS​​ervice覆蓋「loadUserByUsername」的方法,並呼籲內交易。

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    def requst = SecurityRequestHolder.request 
    def httpSession = requst.getSession(false) 
    Integer tenant = httpSession.tenantId 
    TenantUtils.doWithTenant (tenant) { 
User.withTransaction { status -> 
     User user = User.findByUsername(username) 
    } 
    } 
} 

現在我的問題解決了。

+0

嗨ramesh,你可以ping我郵件ID ..我面臨類似的問題 – Vish

0

您必須確保多租戶servlet篩選器在Spring安全篩選器之前註冊。我不確定如何在不重新編譯插件的情況下執行此操作。

相關問題