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

Acegi SecurityContextHolderAwareRequestFilter 核心原理與三大方法覆寫

     編輯:Java 相關知識

SecurityContextHolderAwareRequestFilter 將 HttpServletRequest 包裝,使 Servlet 標準 API (getRemoteUser、getUserPrincipal、isUserInRole) 直接反映 Acegi SecurityContext 中的認證資訊。

一、配置極簡

<bean id="securityContextHolderAwareRequestFilter"
      class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter" />

無需額外屬性,直接加入 Filter 鏈即可。

二、為什麼要包裝 Request?

  1. 屏蔽容器認證:Tomcat Realm 若啟用,原生 Request 會返回容器 Principal,導致應用層看到錯誤身份。Wrapper 強制使用 Acegi Authentication。
  2. 統一程式碼存取:JSP/Controller 可直接用 request.getRemoteUser() 取得登入帳號,無需引入 Acegi API,降低耦合。
  3. 符合 Servlet 規格:Servlet 2.3+ 定義這三個方法正是為安全框架預留擴充點。

三、Wrapper 實作邏輯

public class SecurityContextHolderAwareRequestWrapper extends HttpServletRequestWrapper {
    private AuthenticationTrustResolver authenticationTrustResolver = new AuthenticationTrustResolverImpl();

    public String getRemoteUser() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        return (auth != null) ? auth.getName() : null;
    }

    public Principal getUserPrincipal() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        return (auth != null && authenticationTrustResolver.isAuthenticated(auth)) ? auth : null;
    }

    public boolean isUserInRole(String role) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth == null) return false;
        for (GrantedAuthority ga : auth.getAuthorities()) {
            if (ga.getAuthority().equals(role)) return true;
        }
        return false;
    }
}

四、AuthenticationTrustResolver 輔助

區分「匿名認證」與「真實認證」:isAuthenticated() 排除 AnonymousAuthenticationToken 與 RememberMeAuthenticationToken(視策略而定),確保 getUserPrincipal() 僅在真實登入時返回非 null。

五、類名含義

SecurityContextHolderAwareRequestFilter → 讓 Request 感知 (Aware) SecurityContextHolder 中的內容,透過覆寫三大方法實現。

六、下一步:SavedRequestAwareWrapper

子類新增 SavedRequest 支援,實現「登入前保存目標 URL,登入後自動導向」,詳見後續文章。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved