2009-11-05 32 views
6

我的要求是提供:我可以在同一個彈簧安全配置中放置3種不同的身份驗證方案嗎?

  1. Userid基於密碼的驗證。
  2. 打開基於ID的認證
  3. 基於URL的認證(其定製SSO IMPL我們)
在同一項目

我試圖在Spring安全以插入到現有的項目作爲(剝離下來爲簡單起見代碼):

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

    <http auto-config="false"> 
     <remember-me user-service-ref="rememberMeUserService" key="some custom key" /> <!-- TODO: Key made for testing reasons.... --> 
     <intercept-url pattern='/mainApplication/Main screen.html' access="ROLE_ADMIN"/> 
     <intercept-url pattern='/**' filters="none"/> <!-- Allow entry to login screen --> 
     <openid-login authentication-failure-url="/Login.html?error=true" default-target-url="/mainApplication/Main screen.html" user-service-ref="openIdUserService"/> 
     <form-login login-page="/Login.html" authentication-failure-url="/Login.html?error=true" always-use-default-target="true" default-target-url="/mainApplication/Main screen.html"/> 
    </http> 

    <beans:bean id="rememberMeUserService" class="mypackage.CustomUserService"> 
     <beans:property name="usersService" ref="usersService"></beans:property> 
    </beans:bean> 

    <!-- Common login shared entry-point for both Form and OpenID based logins -->  
    <beans:bean id="entryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint"> 
     <beans:property name="loginFormUrl" value="/Login.html" /> 
    </beans:bean> 
    <authentication-manager alias="authenticationManager"/> 

    <beans:bean id="MyCustomAuthenticationProvider" class="mypackage.CustomAuthenticationProvider"> 
     <custom-authentication-provider /> 
     <beans:property name="usersService" ref="usersService"></beans:property> 
    </beans:bean> 

    <beans:bean id="openIdAuthenticationProvider" class="org.springframework.security.providers.openid.OpenIDAuthenticationProvider"> 
     <custom-authentication-provider /> 
     <beans:property name="userDetailsService" ref="openIdUserService"/> 
    </beans:bean> 

    <beans:bean id="openIdUserService" class="mypackage.OpenIDUserDetailsService"> 
     <beans:property name="usersService" ref="usersService"/> 
    </beans:bean> 

    <!-- Great, now i want to include SSO based sign on --> 
    <!-- need to intercept a url of the form : /myApp/customLogin/<key> where <key> is my token key --> 

</beans:beans> 

如上面提到的,我需要跟蹤的形式的URL:/對myApp/customLogin/12345,其中1235是令牌密鑰,我們最初使用(剝離下來的簡單代碼)

<servlet-mapping> 
    <servlet-name>mySSOCapture</servlet-name> 
    <url-pattern>/myApp/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/MyServlet</url-pattern> 
</servlet-mapping> 

我應該怎麼辦這裏讓Spring Security可以幫助我管理這個第三認證方案?

一個推論的問題是: 我可以在同一個項目中多項認證供應商? 如果是的話,他們怎麼能匹配到不同的功能(例如,一個提供基於URL的認證,一個提供anonomous身份驗證等)?

+0

SSO:對單點登錄(用戶僅通過具有令牌身份驗證)。上面寫的servlet映射在我的web.xml中。公開識別認證和用戶名密碼驗證正在fine.My登錄頁面包含兩種形式之一正常登錄和其他開放ID登錄基礎。 – 2009-11-05 05:36:18

回答

1

好了,這是解決方案:

<beans:bean id="mySsoFilter" class="somePackage.MySsoProcessingFilter"> 
    <custom-filter after="CAS_PROCESSING_FILTER"/> <!-- Just a reference Point--> 
    <beans:property name="authenticationManager" ref="authenticationManager"/> 
    <beans:property name="defaultTargetUrl" value='/mainApplication/Main screen.html' /> 
    <beans:property name="authenticationFailureUrl" value="/Login.html?error=true"/> 
</beans:bean> 

希望這可以幫助別人需要......

+0

就像我使用「之後」,我也用「之前」添加另一個SSO!請注意,CAS與我的系統無關。 – 2009-11-09 09:45:20

1

不能直接回答這個問題,但是從身份管理部門的一個「有用的提示」:並非所有的認證系統具有相同的信任值 - 這是一個嚴重違反了良好的安全性設計,平等地對待他們。

我希望這有助於你的設計...

+0

好,它確實philosopihical維度添加到我的問題:d 我沒有看到這個答案,雖然我 – 2009-11-09 09:39:07

+0

只是暗示什麼看出來的地步。很抱歉,如果它不適用於你。 – caving 2009-11-19 12:00:01

1

可能有幾種方法可以做到這一點。有一些功能可以做非常相似的事情,即Pre-authentication。這是一個很好的例子,您可以添加一個自定義過濾器來驗證用戶,之後框架的其餘部分應該接管。

AuthenticationProvider做的是檢查由前一個過濾器加載到會話中的Authentication對象。您可以根據需要與認證管理器(它簡單地通過所有這些運行Authentication對象)儘可能多的認證供應商註冊,但你必須設法得到了一些過濾器在那裏,將處理您的身份驗證方案,並填充Authentication對象。如果您希望此過濾器也與用戶交互(即顯示登錄表單或其他內容),則可能會干擾其他過濾器。在這種情況下,您可以使用單獨的濾波器鏈,但這聽起來不像您的情況。

+0

我讀了PreAuthentication,我想你錯了我的問題,我想讓用戶以3種不同的方式登錄: 用戶名/密碼,Open Id,SSO。 – 2009-11-09 09:40:50

+0

我很欣賞關於認證管理員的額外信息,Infor已經清除了我的一些基礎知識,我不確定您對過濾器鏈的含義。 – 2009-11-09 12:35:03

+0

對不起,我覺得你的登錄方案與其他方式太不一樣了,以便能很好地適應它。至於過濾器鏈,基本上所有請求都經過一個彈簧安全過濾器鏈,但是如果需要的話,您可以設置兩個或更多,過濾不同的URL。這樣你可以使用完全不同的過濾器/認證機制,但它有點複雜。 – wds 2009-11-09 21:05:58

相關問題