Spring企业应用安全框架解析
立即解锁
发布时间: 2025-08-19 02:32:45 阅读量: 3 订阅数: 11 


Spring框架下的Java开发实践与进阶
### Spring 企业应用安全框架解析
#### 1. Spring 与安全概述
Spring 更像是一个平台而非传统意义上的框架,其集成和支持服务众多,难以在一篇文章中全面涵盖。在企业应用开发中,安全是至关重要的一环。不同的企业应用由于其问题领域、目标用户群体以及对核心业务的重要性不同,所需的安全类型也存在很大差异。例如,互联网银行应用和内部电话目录应用的安全要求就有很大区别。这种广泛的安全需求差异给通用安全框架的开发带来了巨大挑战。
#### 2. 企业应用安全需求
大多数 Spring 用户利用其灵活性开发健壮的多层企业应用,这些应用通常以数据为中心,有多个并发用户,对核心业务至关重要,因此需要强大的安全措施。下面我们来详细了解企业应用常见的安全需求:
- **关键术语**
- **主体(Principal)**:指可以执行操作的用户、服务或代理。
- **认证(Authentication)**:主体通过提供密码等凭证来建立身份的过程。
- **授权(Authorization)**:确定主体(已认证或未认证)是否被允许执行特定操作的过程。
- **主要安全关注点**
1. **认证(Authentication)**:企业应用通常需要访问各种认证存储库,如 LDAP 目录、CRM 系统、企业单点登录解决方案和特定于应用的数据库。根据存储库的不同,服务器可能不会暴露凭证,或者凭证以哈希格式存储。每个认证存储库还必须跟踪授予主体的权限。安全框架需要与这些类型的存储库集成,并且要一致处理来自不同客户端类型(如 Web 应用、Swing 客户端和 Web 服务)的认证请求。
2. **Web 请求安全(Web request security)**:许多企业应用是基于 Web 的,常使用 MVC 框架并可能发布 Web 服务。需要保护 URI 模式,并且 Web 视图通常需要与安全框架集成,以便根据主体的权限生成内容。
3. **服务层安全(Service layer security)**:除了最简单的应用外,服务(业务)层都应该进行安全保护。安全通常最好以切面的形式建模。基于 AOP 的解决方案可以使服务层实现基本或完全不感知安全,避免了通过 URI 模式过滤等技术在用户界面层实施安全的易出错和繁琐的方法。
4. **域对象实例安全(Domain object instance security)**:Java 应用通常使用域对象来建模问题领域。不同的域对象实例可能需要不同的安全设置。主体对一个域对象实例可能有删除权限,而对另一个域对象实例可能只有读取权限。权限分配给接收者(主体或角色),分配给不同接收者的给定域对象实例的权限列表称为访问控制列表(ACL)。
- **非典型安全关注点**:有限权限执行(Limited privilege execution)在企业应用中并不典型。一些 Java 应用(如 applet 或 Java Web Start 应用)由于用户对应用的可信任性担忧,需要以有限权限执行。但企业应用通常在受信任的计算机(如企业服务器)上运行,因此大多数企业应用以有限权限执行会带来不必要的复杂性。
#### 3. 推荐的安全框架 - Acegi Security
基于上述企业应用的安全需求,推荐使用 Acegi Security System for Spring(http://acegisecurity.sourceforge.net;Apache 2 许可)来处理 Spring 管理的应用的安全需求。
- **Acegi Security 简介**:Acegi Security 在 Spring 社区中广泛用于为 Spring 驱动的应用提供全面的安全服务。它由一组通过 Spring IoC 容器配置的接口和类组成。其设计允许许多应用仅通过 IoC 容器中的声明性配置设置来实现上述四个常见的企业应用安全需求。Acegi Security 高度依赖接口,为定制和扩展提供了很大的空间。它强调可插拔性,认为没有一种适用于所有情况的安全方法,而是从安全角度提供一致的编程模型,同时允许选择不同的策略来实现关键的安全职责。
- **Acegi Security 对常见安全需求的处理**
1. **认证(Authentication)**:在处理其他三个安全需求之前,必须先对主体进行认证。Acegi Security 使用可插拔的 AuthenticationManager 进行认证,可在 Spring 应用上下文中定义如下:
```xml
<bean id="authenticationManager"
class="net.sf.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="daoAuthenticationProvider"/>
</list>
</property>
</bean>
<bean id="daoAuthenticationProvider"
class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider">
<property name="authenticationDao"><ref local="jdbcDaoImpl"/></property>
</bean>
<bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
```
`authenticationManager` bean 将通过认证提供者列表进行委托(上述代码示例仅显示了一个)。认证提供者能够从给定的认证存储库进行认证。在这种情况下,`daoAuthenticationProvider` bean 将用于认证,它使用数据访问对象来检索用户信息。
2. **Web 请求安全(Web Request Security)**:Acegi Security 通过 `FilterSecurityInterceptor` 和 `Security EnforcementFilter` 提供 Web 请求安全。`Security EnforcementFilter` 类作为 `web.xml` 过滤器实现,过滤器本身在应用上下文中定义:
```xml
<bean id="securityEnforcementFilter"
class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter">
<property name="filterSecurityInterceptor">
<ref local="filterInvocationInterceptor"/>
</property>
<property name="authenticationEntryPoint">
<ref local="authenticationProcessingFilterEntryPoint"/>
</property>
</bean>
<bean id="authenticationProcessingFilterEntryPoint"
class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl"><value>/acegilogin.jsp</value></property>
</bean>
<bean id="filterInvocationInterceptor"
class="net.sf.sf.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager">
<ref bean="authenticationManager"/>
</property>
<property name="accessDecisionManager">
<ref local="httpRequestAccessDecisionManager"/>
</property>
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/secure/super/**=ROLE_WE_DONT_HAVE
/secure/**=ROLE_SUPERVISOR,ROLE_USER
</value>
</property>
</bean>
```
大部分上述代码是样板代码,实际要保护的 URI 模式在 `filterInvocationInterceptor` bean 的 `objectDefinitionSource` 属性中定义。可以看到,`filterInvocationInterceptor` bean 使用 Apache Ant 风格的路径来表达 URI 模式,除了 Apache Ant 路径,还支持正则表达式。`CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON` 指示过滤器以不区分大小写的方式匹配 URI 模式。这些声明将阻止主体访问 `/secure` URI,除非他们拥有两个指定角色之一,并且阻止访问 `/secure/super`,除非主体拥有 `ROLE_WE_DONT_HAVE` 角色。
3. **服务层安全(Service Layer Security)**:Acegi Security 通过应用上下文提供全面的服务层安全。这里我们定义一个 AOP Alliance 方法拦截器,通过 Spring 的 `DefaultAdvisorAutoProxyCreator` 自动装配:
```xml
<b
```
0
0
复制全文
相关推荐










