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

Acegi Security 系列第 5 部分:JSF 應用中 JavaBean 安全保護實戰

     編輯:Java 相關知識

系列回顧與本文目標

前四部分已涵蓋 URL 安全、LDAP 策略、方法級安全、JSF 頁面保護。本文聚焦JSF 應用中 JavaBean(托管 Bean 與 IOC Bean)的安全訪問控制,實現零安全代碼的聲明式 Bean 保護。

兩種核心保護策略

策略一:保護 JSF 托管 Bean(Managed Bean 包裝模式)

創建一個 JSF 托管 Bean 作為「外殼」,其屬性映射到受 Acegi 保護的 IOC Bean:

1. faces-config.xml 配置托管 Bean 映射

<faces-config>
  <managed-bean>
    <managed-bean-name>catalog</managed-bean-name>
    <managed-bean-class>sample.Catalog</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    
    <!-- 公共數據映射到不受保護的 IOC Bean -->
    <managed-property>
      <property-name>publicData</property-name>
      <value>#{publicCatalog.data}</value>
    </managed-property>
    
    <!-- 私有數據映射到受保護的 IOC Bean -->
    <managed-property>
      <property-name>privateData</property-name>
      <value>#{privateCatalog.data}</value>
    </managed-property>
  </managed-bean>
  
  <!-- 關鍵:配置 Spring 變量解析器,支援解析 IOC Bean -->
  <application>
    <variable-resolver>
      org.springframework.web.jsf.DelegatingVariableResolver
    </variable-resolver>
  </application>
</faces-config>

2. Catalog 托管 Bean 實現(純 POJO)


public class Catalog {
    private String publicData;
    private String privateData;
    // 標準 getter/setter,JSF 自動調用
    public void setPublicData(String publicData) { this.publicData = publicData; }
    public String getPublicData() { return publicData; }
    public void setPrivateData(String privateData) { this.privateData = privateData; }
    public String getPrivateData() { return privateData; }
}

3. 受保護的 IOC Bean 定義(在 Acegi/Spring 配置中)


<bean id="publicCatalog" class="sample.PublicCatalog" />
<bean id="privateCatalog" class="sample.PrivateCatalog" />

<!-- privateCatalog 代理配置,攔截器執行安全檢查 -->
<bean id="proxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  <property name="beanNames">
    <list><value>privateCatalog</value></list>
  </property>
  <property name="interceptorNames">
    <list><value>privateCatalogSecurityInterceptor</value></list>
  </property>
</bean>

策略二:直接在 JSF 頁面使用受保護的 IOC Bean

無需托管 Bean 包裝,JSF 表達式直接引用 IOC Bean:

<h:outputText value="#{publicCatalog.data}" />
<h:outputText value="#{privateCatalog.data}" />

前提:同樣需配置 DelegatingVariableResolver,Acegi 代理攔截器自動執行授權檢查。

協作流程深度解析

策略一流程(托管 Bean 模式)

  1. 用戶訪問 JSF 頁面
  2. Acegi 執行 URL 級授權(參考第 4 部分)
  3. Faces Servlet 準備渲染,發現 catalog 托管 Bean
  4. JSF 解析 faces-config.xml,實例化 Catalog,發現屬性引用 publicCatalog/privateCatalog
  5. DelegatingVariableResolver 解析 IOC Bean(委派 Spring 容器)
  6. JSF 調用 IOC Bean 的 getData() 獲取數據
  7. 關鍵點:Acegi 方法安全攔截器攔截調用,執行授權決策
  8. 授權通過 → 返回數據 → JSF 調用 catalog.setPrivateData() 注入
  9. JSF 生命周期繼續,渲染頁面

策略二流程(直接 IOC Bean 模式)

流程簡化:第 3-4 步直接解析頁面中的 #{privateCatalog.data},後續授權邏輯相同。

零代碼部署現有 JSF 應用:四步配置法

  1. 編寫標準 Acegi 配置文件(參考第 1-3 部分)
  2. 配置 web.xml 整合 Acegi Filter(參考第 4 部分)
  3. 在 faces-config.xml 中聲明 DelegatingVariableResolver
  4. 將需保護的托管 Bean 重新聲明為 Acegi IOC Bean(移至 Spring 配置),並配置方法安全攔截器

核心優勢:業務邏輯零安全代碼,安全策略集中在 XML 配置,職責分離徹底。

示例應用部署指南

源碼包含兩個示例:

  • JSFAcegiSampleWithSecureManagedBeans:策略一演示
  • JSFAcegiSampleWithIOCBeans:策略二演示

部署步驟

  1. WAR 複製到 Tomcat webapps
  2. 下載 JSF 1.1 (jsf-1_1_01.zip) 解壓,所有 JAR 複製到 WEB-INF/lib
  3. 下載 cglib-full-2.0.2.jar 複製到 WEB-INF/lib(代理所需)
  4. 啟動 Tomcat,訪問 https://localhost:8080/應用名

總結

Acegi 在 JSF 中的 Bean 保護體現了聲明式安全精髓:通過 DelegatingVariableResolver 打通 JSF 與 Spring 容器,利用 Spring AOP 代理攔截 Bean 方法調用,配合方法安全攔截器實現細粒度授權。兩種模式各有適用場景——托管 Bean 模式適合漸進式遷移現有 JSF 應用,直接 IOC Bean 模式適合新架構設計。配合前文的 URL/頁面保護,構建了完整的 JSF 應用安全體系。

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