2010-09-08 52 views
17

我們正在構建一個Web應用程序,可供經過身份驗證的用戶和匿名用戶使用。如果您決定不註冊/登錄,您只有一組功能。用戶身份驗證通過Spring Security與OpenID完成。這工作正常。與Spring Security在同一個應用程序中的兩個領域?

但是,該應用程序還附帶一個管理UI,部署在<host>/<context-root>/admin。我們可以在Spring Security中有兩個獨立的領域(例如/admin/**的基本身份驗證)?如何配置?

回答

18

Spring Security在版本3.1中添加了對此方案的支持,該版本目前可作爲發佈候選版本提供。它由SEC-1171實現,語法的細節在3.1手冊中。

但是它使用起來非常簡單。基本上,您只需在您的Spring Security配置中定義多個http元素,每個領域一個元素。我們使用這樣的:

<!-- Configure realm for system administration users --> 
<security:http pattern="/admin/**" create-session="stateless"> 
    <security:intercept-url pattern='/**' access='ROLE_ADMIN' requires-channel="https" /> 
    <security:http-basic/> 
</security:http> 


<!-- Configure realm for standard users --> 
<security:http auto-config="true" access-denied-page="/error/noaccess" use-expressions="true" create-session="ifRequired"> 
    <security:form-login login-page="/login" 
      ... 
      ... 
</security:http> 

要注意的關鍵是第一http元素的pattern="/admin/**"。這告訴Spring,/admin下的所有URL都受到該領域的約束,而不是默認領域 - 因此/admin下的URL使用基本身份驗證。

+0

我一直在挖掘所有試圖弄清楚如何做到這一點,謝謝你指出它如此清楚! – 2011-03-15 13:34:11

+1

春季安全3.1。0已在7/12/2011正式發佈 – lrkwz 2012-05-14 11:00:51

+0

我正在做這個,如果我登錄到管理部分我也登錄到用戶部分,但未經授權(當然)。我認爲這是因爲春季安全在一個關鍵的會話中持有授權。有沒有一種方法來配置彈簧安全的情況下,你可以記錄到管理和用戶部分在同一時間與不同的授權實體? – 2012-12-04 10:15:57

0

我想不出有兩個領域一個直接的方式(我沒有嘗試,我自己):

您可以定義兩個過濾器in your web.xml其中每個那些有不同的彈簧配置和ERGO一個自己的環境。全局的東西進入應用程序配置,在過濾器配置特定領域。

如果它只用於不同的驗證方法,則可以使用write your own filter,然後決定調用哪個濾鏡。

1

可能的解決方案:

  • 添加URL的攔截器/admin的要求 「ROLE_ADMIN」 的org.springframework.security.web.authentication.www.BasicAuthenticationFilter
  • 配置實例攔截/admin URL,如果它提供了相應的證書來認證用戶爲ROLE_ADMIN

示例配置:

<security:intercept-url pattern="/admin" access="ROLE_ADMIN"/> 

<bean id="basicAuthenticationEntryPoint" 
     class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint"> 
    <property name="realmName" 
       value="WS realm"/> 
</bean> 

<bean id="basicAuthenticationProcessingFilter" 
     class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter"> 
    <property name="authenticationManager" 
       ref="authenticationManager"/> 
    <property name="authenticationEntryPoint" 
       ref="basicAuthenticationEntryPoint"/>  
</bean> 

注意:BasicAuthenticationFilter的默認實現是一個被動過濾器,即它只是在請求中尋找一個基本的auth頭文件,如果它不存在 - 什麼也不做。如果你希望過濾器明確要求從客戶的基本身份驗證,則需要延長的默認實現開始到身份驗證入口點:

public class BasicAuthenticationFilter 
     extends org.springframework.security.web.authentication.www.BasicAuthenticationFilter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

     final HttpServletRequest request = (HttpServletRequest) req; 
     final HttpServletResponse response = (HttpServletResponse) res; 

     String header = request.getHeader("Authorization"); 

     if ((header != null) && header.startsWith("Basic ")) { 
      super.doFilter(req, res, chain); 
     } else { 
      getAuthenticationEntryPoint().commence(request, response, new AuthenticationCredentialsNotFoundException("Missing credentials")); 
     } 
    } 
} 

此外,你需要調整過濾器適用於/admin網址只能通過在doFilter方法中對此進行硬編碼或通過提供適當的包裝bean來實現。

相關問題