2011-10-12 79 views
1

我有一個自定義用戶類,它擴展了User(Spring Security)類和Custome UserDetailsS​​ervice類。此服務使用Hibernate服務方法查詢數據庫以獲取用戶詳細信息。如果在該數據庫中沒有找到該userId的記錄,而不是拋出UsernamNotFoundException,那麼我想創建一個虛擬的Custom用戶對象,並使用只讀屬性傳遞身份驗證。但我無法正常工作,因爲我不確定如何檢索用戶在登錄頁面輸入的密碼值。我需要將它傳遞給自定義用戶的構造函數,以正確地驗證它。如何檢索自定義UserDetailsS​​ervice中的登錄表單密碼

因此,總結起來,有沒有辦法檢索用戶在loadUserByUserName()方法內的登錄頁面輸入的密碼?在此先感謝

+0

我知道你不是在問什麼,但是如何使用角色呢?在用戶表中添加其他字段,例如角色,並將虛擬用戶作爲其他普通用戶添加到數據庫,但設置角色ROLE_DUMMY_USER。在網絡應用程序中,您可以檢查登錄用戶的角色,並根據他所擁有的角色決定他可以做什麼以及不能做什麼。 – marioosh

+0

感謝您的答覆marioosh ..這正是我最初的想法,但該應用程序允許單個會話每個用戶。因此,不能在所有虛擬用戶使用的用戶表中記錄一條記錄。 – RKodakandla

回答

2

我正在做一些類似的事情當前項目。在過去的兩週裏,我剛剛開始涉足Spring Security,但在那段時間裏我真的深入瞭解了它(附加源代碼,在調試器中進行了檢查)。

我有一個延伸org.springframework.security.core.userdetails.User自定義用戶類和實現org.springframework.security.core.userdetails.UserDetailsS​​ervice界面的自定義類。

如你所知,在loadUserByUsername方法在的UserDetailsS​​ervice接口的簽名指定一個類實現的UserDetails接口將被退回。

Spring Security的是要採取實現的UserDetails類和檢查通過登錄表單/基本身份驗證提供的用戶名和密碼/摘要式身份驗證/對用戶名(無論驗證您選擇方案)和密碼的UserDetails

我還沒有找到一種方法,您可以通過身份驗證方案獲取由最終用戶提供的憑據。如果你願意的話,我可以試着在明天回去工作時看看它(我在家裏並且從內存中寫下來)。

+0

感謝Philip爲您提供的幫助。我希望你找到一些有關如何檢索它的信息..我正在做的確如此,擴展User類以具有Customuser類,並且我遇到了新問題。如果委託人被第三方我似乎無法實例化自定義用戶,因爲沒有密碼..... :( – RKodakandla

0

我正在運行Spring 3.0.6 RELEASE和Spring Security 3.0.6 RELEASE。

我在調試器中運行的代碼,你將無法在認證對象從自定義的UserDetailsS​​ervice獲得。

不過,我相信你可以創建自己的AuthenticationProvider,使程序在它:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/core-services.html

請參考此代碼從Spring Security的org.springframework.security.authentication.ProviderManager,其循環通過AuthenticationProvider的(一個或多個)片段:

for (AuthenticationProvider provider : getProviders()) { 
     if (!provider.supports(toTest)) { 
      continue; 
     } 

     logger.debug("Authentication attempt using " + provider.getClass().getName()); 

     try { 
      result = provider.authenticate(authentication); 

      if (result != null) { 
       copyDetails(authentication, result); 
       break; 
      } 
     } catch (AccountStatusException e) { 
      // SEC-546: Avoid polling additional providers if auth failure is due to invalid account status 
      eventPublisher.publishAuthenticationFailure(e, authentication); 
      throw e; 
     } catch (AuthenticationException e) { 
      lastException = e; 
     } 
    } 

正如你所看到的,它遍歷每個的AuthenticationProvider並傳遞憑據。希望有所幫助!

菲利普

+0

感謝菲利普..我會嘗試,看看我是否可以利用這個.. – RKodakandla

0

我們能夠做一些類似你通過擴展AbstractUserDetailsAuthenticationProvider問什麼東西。有一個方法retrieveUser(String _userName,UsernamePasswordAuthenticationToken _authToken),您可以覆蓋並放入您自己的自定義邏輯中。返回對象是一個UserDetails。因此,您可以創建自己的自定義UserDetails並將其返回給框架(注意:您也可以在此方法中設置只讀屬性)。

此時,Spring Security將不會嘗試使用密碼進行身份驗證。他們將其留給您可以覆蓋的additionalAuthenticationChecks(UserDetails _userDetails,UsernamePasswordAuthenticationToken _authToken)方法。由於這是您要進行密碼驗證的地方,因此可以跳過驗證並讓方法返回。此時你的匿名用戶將被驗證。

最後補充到這一點您的security.xml

<authentication-manager alias="authenticationManager"> 
    <authentication-provider ref="appUserSecurityService" /> 
</authentication-manager> 

我希望這有助於!

+0

謝謝jcurtin ..這正是我我正在尋找.. – RKodakandla

相關問題