SecurityContextHolderAwareRequestFilter 將原生 HttpServletRequest 包裝為 SecurityContextHolderAwareRequestWrapper 或 SavedRequestAwareWrapper,讓 Servlet API 的 getRemoteUser()、getUserPrincipal()、isUserInRole() 直接映射至 Acegi 的 Authentication 物件。
一、基本配置
<bean id="securityContextHolderAwareRequestFilter"
class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter" />
<!-- Filter 鏈 -->
/**=httpSessionContextIntegrationFilter,
logoutFilter,
authenticationProcessingFilter,
securityContextHolderAwareRequestFilter,
exceptionTranslationFilter,
filterInvocationInterceptor
二、Wrapper 選擇機制
- 預設硬編碼使用
SavedRequestAwareWrapper.class(繼承自 SecurityContextHolderAwareRequestWrapper)。
- 可透過
setWrapperClass(Class<? extends HttpServletRequestWrapper>) 注入自訂 Wrapper。
- 自訂 Wrapper 需提供
public Constructor(HttpServletRequest, PortResolver)。
三、核心方法覆寫
| Servlet 方法 | Wrapper 實作邏輯 |
getRemoteUser() | 返回 Authentication.getName() |
getUserPrincipal() | 返回 Authentication 物件本身(實作 Principal) |
isUserInRole(role) | 檢查 Authentication.getAuthorities() 是否包含角色 |
四、解決容器認證衝突
Tomcat 自身若配置 web.xml <security-constraint>,原生 Request 會返回容器管理的 Principal。Wrapper 覆寫後,確保應用層看到的永遠是 Acegi 管理的身份,避免雙重認證體系衝突。
五、HttpRequestIntegrationFilter 補充
若需整合容器 JAAS/Realm 認證,可加入 HttpRequestIntegrationFilter,將 request.getUserPrincipal() 寫入 SecurityContext,實現容器認證 → Acegi 授權的混合模式。
六、進階:自訂 Wrapper 範例
public class CustomRequestWrapper extends SavedRequestAwareWrapper {
public CustomRequestWrapper(HttpServletRequest request, PortResolver portResolver) {
super(request, portResolver);
}
@Override
public String getRemoteUser() {
// 例如:匿名用戶顯示 "guest"
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
return (auth != null && auth.isAuthenticated()) ? auth.getName() : "guest";
}
}
配置:
<bean id="securityContextHolderAwareRequestFilter"
class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter">
<property name="wrapperClass" value="com.example.CustomRequestWrapper"/>
</bean>
- 上一篇文章: 借鑑 Acegi ExceptionTranslationFilter 設計優雅的異常處理架構
- 下一篇文章: Acegi SavedRequestAwareWrapper 與 SavedRequest 機制深度解析
Copyright ©
程式碼之家 All Rights Reserved