7

以下是該場景。我是在AD域中的Web服務器上運行的代碼。有些客戶已連接到我。如何讓客戶的用戶名無需客戶在瀏覽器中填寫表單?必須在Web服務器端使用Java技術。獲取連接到Web服務器的客戶端的用戶名

編輯:

我最終使用於以下鏈接描述的春季安全協商篩選。有一個教程可用。使用request.getPrincipal()。getName()從一個servlet中提供用戶名。

http://waffle.codeplex.com/

+0

@DA .. :) ..順便說一句,原因是我使用的是tomcat和spring。 – KyleM 2011-04-28 22:58:11

+0

沒有用戶名。您的請求本質上沒有意義,除非您在AD域中。 – SLaks 2011-04-28 23:03:17

+0

@Slaks我在一個AD域中。對不起,不包括那些重要的信息。 – KyleM 2011-04-28 23:07:29

回答

11

您需要設置Spring Security Kerberos extension - 這是您在Spring Security 3中完成描述的唯一方法。它支持SPNEGO協商,但需要在服務器上進行一些設置(以及知識SPNEGO和Kerberos如何工作)。

沒有太多的文檔 - 但Mike 1.0M2的示例應用程序非常棒,涵蓋了大多數常見的場景,包括自動化的SPNEGO身份驗證。

爲SPNEGO的關鍵是要建立一個自定義的AuthenticationEntryPoint - 你需要有一個自定義的Spring bean要做到這一點,如下所示:

<bean id="kerbEntryPoint" class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" /> 

<bean id="kerbAuthenticationProcessingFilter" class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter"> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

...還有更多的bean會除此之外還需要(同樣,請參閱帶有Kerberos擴展的樣本)。如果您與Spring Security進一步協作或需要確切的詳細信息(因爲涉及到一些bean/config位,有些配置知識會對您有所幫助,例如您是否使用<http>命名空間樣式)。

除了這個選項,你將不得不建立一個類似的SPNEGO身份驗證類型(如使用WAFFLE,正如你所建議的) - other SO questions涵蓋了這個很好。

最後,您可能會更好地將Tomcat與支持SPNEGO或NTLM的另一個Web服務器(如Microsoft IIS或Apache Web Server)相關聯,其中包括mod_spnego

希望其中的一個想法能爲你效勞!

+0

謝謝彼得。我更喜歡象帶有或不帶有Kerberos的Waffle這樣的解決方案,所以我認爲我會堅持。無論如何,感謝您的幫助和鏈接。 – KyleM 2011-05-05 13:36:42

+0

只是爲了澄清 - 如果您在描述的AD域中,那麼您可能已經運行了Kerberos - W2K3,並且通常默認啓用它。 – 2011-05-05 17:05:45

2

for Windows來做到這一點是SPNEGO的最新方法。爲了使其充分發揮作用,您需要使用服務器在AD中擁有一個帳戶,並與Kerberos通信。然後,我被告知,Spring Security支持這一點。

現在,並不總是需要授權用戶。有時(例如出於統計的原因)足以獲得用戶的AD ID。當我在玩SPNEGO時,從瀏覽器傳來的二進制數據包含了明文形式的用戶標識。它可以從那裏提取,但當然不能被信任。

NTLM已過時,被認爲不太安全,並且很大程度上從環境中推出。

+0

我不需要驗證用戶,只要看看他們的用戶名或「AD ID」即可。 – KyleM 2011-04-29 13:46:56

6

您的用戶使用哪種瀏覽器?如果IE;有一個簡單的解決方案:

<html> 
<script type="text/javascript"> 
var WinNetwork = new ActiveXObject("WScript.Network"); 
alert(WinNetwork.UserName); 
</script> 
</html> 
+1

謝謝,但正如我所說的「必須在Web服務器端使用Java技術」。 JS並沒有削減它,因爲有動機的用戶可以發送我想要的任何用戶名。無論如何,請有一個upvote。 – KyleM 2011-05-05 13:37:54

+0

我想在一個受控的環境中,你不會激勵用戶,無論如何,感謝upvote。 – abalogh 2011-05-05 13:42:35

+0

你是對的 - 我懷疑我的環境中的用戶會嘗試(甚至不知道怎麼做) - 但我要格外小心,並且不會因爲學習而傷害。 – KyleM 2011-05-05 13:45:42

1

如果您使用Tomcat,然後使用WAFFLE

0

我敢打賭,你可以把Apache Web服務器放在Tomcat的前面,這樣Apache可以使用NTLMKerberos進行身份驗證。然後,您可以使用重寫規則將請求以普通用戶名的形式發送給tomcat。這只是一個想法,我沒有自己實現。但是,我們在Intranet中使用Apache Kerberos身份驗證。我的建議是不使用NTLM,它是過時和片狀。