我們正在構建一個Web應用程序,可供經過身份驗證的用戶和匿名用戶使用。如果您決定不註冊/登錄,您只有一組功能。用戶身份驗證通過Spring Security與OpenID完成。這工作正常。與Spring Security在同一個應用程序中的兩個領域?
但是,該應用程序還附帶一個管理UI,部署在<host>/<context-root>/admin
。我們可以在Spring Security中有兩個獨立的領域(例如/admin/**
的基本身份驗證)?如何配置?
我們正在構建一個Web應用程序,可供經過身份驗證的用戶和匿名用戶使用。如果您決定不註冊/登錄,您只有一組功能。用戶身份驗證通過Spring Security與OpenID完成。這工作正常。與Spring Security在同一個應用程序中的兩個領域?
但是,該應用程序還附帶一個管理UI,部署在<host>/<context-root>/admin
。我們可以在Spring Security中有兩個獨立的領域(例如/admin/**
的基本身份驗證)?如何配置?
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使用基本身份驗證。
我想不出有兩個領域一個直接的方式(我沒有嘗試,我自己):
您可以定義兩個過濾器in your web.xml其中每個那些有不同的彈簧配置和ERGO一個自己的環境。全局的東西進入應用程序配置,在過濾器配置特定領域。
如果它只用於不同的驗證方法,則可以使用write your own filter,然後決定調用哪個濾鏡。
可能的解決方案:
/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來實現。
我一直在挖掘所有試圖弄清楚如何做到這一點,謝謝你指出它如此清楚! – 2011-03-15 13:34:11
春季安全3.1。0已在7/12/2011正式發佈 – lrkwz 2012-05-14 11:00:51
我正在做這個,如果我登錄到管理部分我也登錄到用戶部分,但未經授權(當然)。我認爲這是因爲春季安全在一個關鍵的會話中持有授權。有沒有一種方法來配置彈簧安全的情況下,你可以記錄到管理和用戶部分在同一時間與不同的授權實體? – 2012-12-04 10:15:57