Acegi Security(現 Spring Security)是基於 Spring 的企業級安全框架,通過在 Spring 容器配置 Bean,充分利用 IoC 與 AOP,提供宣告式安全存取控制。雖可用於非 Spring 環境,但與 Spring 整合最自然。其核心優勢:業務代碼零侵入,安全邏輯外部化配置。
| 維度 | 控制粒度 | 典型場景 | 實現機制 |
|---|---|---|---|
| URL 資源 | 路徑模式(Ant/Regex) | 匿名訪問首頁,登入用戶訪問 /user/** | Servlet Filter 鏈攔截 HttpServletRequest |
| 業務方法 | Bean 方法級 | 所有用戶可查詢,只有管理員可刪除 | Spring AOP 方法攔截器 |
| 領域物件 | 具體實體實例 (ACL) | 用戶只能修改自己的貼文 | AfterInvocationProvider + ACL 查詢 |
多個 Servlet Filter 組成鏈,核心 FilterSecurityInterceptor 在請求進入 Controller 前判斷權限。配置範例:
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="objectDefinitionSource">
<value>
PATTERN_TYPE_APACHE_ANT
/index.jsp=ROLE_ANONYMOUS
/user/**=ROLE_USER
/admin/**=ROLE_ADMIN
</value>
</property>
</bean>
Spring AOP 代理目標 Bean,攔截受保護方法。配置支援角色投票、ACL 權限:
<bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="objectDefinitionSource">
<value>
com.bbs.BbtForum.getRefinedTopicCount=ROLE_ANONYMOUS
com.bbs.BbtForum.addTopic=ROLE_USER
com.bbs.BbtForum.updateUser=ROLE_USER,ACL_CONTACT_ADMIN
</value>
</property>
</bean>
Servlet Filter 本質是「請求級切面」,Spring AOP 是「方法級切面」。Acegi 將兩者統一在 AOP 理念下:業務開發完成後,像穿「鐵布衫」一樣透過配置為應用穿上安全防護,零代碼侵入,極致分離關注點。
org.acegisecurity → org.springframework.security。<security:http>、<security:global-method-security> 取代大量 Bean 定義。Acegi/Spring Security 證明了「安全即切面」的架構威力。掌握其三大控制維度、Filter 與 AOP 的協作模型、ACL 領域物件保護機制,是構建企業級安全應用的核心能力。