首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Acegi SecurityContextHolderAwareRequestFilter 總結與進階

     編輯:Java 相關知識

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)。

三、核心方法覆寫

四、解決容器認證衝突

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>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
Servlet 方法Wrapper 實作邏輯
getRemoteUser()返回 Authentication.getName()
getUserPrincipal()返回 Authentication 物件本身(實作 Principal)
isUserInRole(role)檢查 Authentication.getAuthorities() 是否包含角色