2010-02-10 139 views
0

我正慢慢地瘋狂地試圖配置Spring Security 3.0.0來保護應用程序。使用X.509證書的Spring Security

我已配置服務器(jetty)以要求客戶端身份驗證(使用智能卡)。但是,我似乎無法得到applicationContext-security.xml和UserDetailsS​​ervice實現的權利。

首先,從應用程序上下文文件:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:security="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 


<security:global-method-security secured-annotations="enabled" /> 

<security:http auto-config="true"> 
    <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/> 
    <security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="accountService" /> 
</security:http> 

<bean id="accountService" class="com.app.service.AccountServiceImpl"/> 

這個UserDetailsS​​ervice看起來是這樣的:

public class AccountServiceImpl implements AccountService, UserDetailsService { 

private static final Log log = LogFactory.getLog(AccountServiceImpl.class); 

private AccountDao accountDao; 

@Autowired 
public void setAccountDao(AccountDao accountDao) { 
    this.accountDao = accountDao; 
} 

public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException, DataAccessException { 

    log.debug("called loadUserByUsername()"); 
    System.out.println("called loadByUsername()"); 

    Account result = accountDao.getByEdpi(s); 
    return result; 

} 

}

應用程序有一個 「頭版」 用一個登錄按鈕,因此訪問不應該要求任何形式的認證。

任何幫助表示讚賞。

回答

4

該應用程序具有帶「登錄」按鈕的「首頁」,因此對該應用程序的訪問不應要求任何形式的身份驗證。

有什麼問題就在這裏。如果你設置你的servlet容器需要客戶端身份驗證,你不能有這樣的開放式的,所有的頁面,在這種情況下,身份驗證握手會爲用戶無需智能卡沒有成功,他們甚至不會看到容器錯誤頁面 - 這將是瀏覽器錯誤,而不是。

這是可以做到使容器允許客戶端驗證,使登錄頁面打開匿名用戶和安全由SpringSec其他頁面。但我不會爲smartcard-PKI應用推薦這款產品。智能卡身份驗證意味着安全重要性,讓非智能卡用戶在容器握手早期拋出更爲可靠。在這種情況下,您仍然可以在另一個端口上擁有用戶友好的登錄頁面,其中「登錄」按鈕鏈接到您的應用。

如果您需要SpringSecurity安裝方面的幫助,請在您的文章中添加有關問題的更多信息。

+1

在Tomcat中,您可以將其設置爲不需要客戶端身份驗證,而是通過在 EpicPandaForce

1

從配置角度來看,這看起來不錯。你看到什麼錯誤?你是否看到你的UserDetailsS​​ervice被X.509證書中的CN調用?