抢占先机
VMware 提供培训和认证,为您的发展加速。
了解更多我们很高兴宣布 Spring Security 3.0 的第一个里程碑版本现已可供下载。该版本也可以通过 Maven 里程碑仓库获取,地址是http://maven.springframework.org/milestone。与 Spring 3.0 一样,这是第一个要求最低 JDK 1.5 才能运行的版本,同时也需要 Spring 3.0,因此如果您尚未在使用,应该获取 Spring 3.0.0.M3 版本。那么这个版本有什么新内容和变化呢?
<http use-expressions="true">
<intercept-url pattern="/secure/**" access="hasRole('ROLE_SUPERVISOR') and hasIpAddress('192.168.1.0/24')" />
...
</http>;
内置的hasRole('ROLE_SUPERVISOR')表达式并不复杂——它只是检查当前用户的权限列表,如果用户具有指定的角色则返回 true。但我们添加了一个额外的表达式来指定发出请求的 IP 地址必须在子网/掩码参数定义的范围内。根据您的网络设置,这可能实用也可能不实用,但它说明了基于表达式的方法有多强大。以前包含在“access”XML 属性中的安全属性列表已被布尔表达式取代。如果表达式求值为“true”,则授予访问权限。如果求值为“false”,则拒绝访问权限。
<global-method-security pre-post-annotations="enabled"/>
最明显有用的注解是@PreAuthorize,它控制方法是否实际可以被调用。例如(来自“Contacts”示例应用程序)
@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);
,这意味着只有具有“ROLE_USER”角色的用户才允许访问。这里没什么新东西。但如果是
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
这里我们实际上是使用一个方法参数作为表达式的一部分来决定当前用户是否对给定的联系人拥有“admin”权限。hasPermission()表达式通过应用程序上下文链接到 Spring Security ACL 模块(请参见 Contacts 示例配置了解如何实现)。如果您的代码编译时包含调试信息,您可以按名称访问任何方法参数作为表达式变量。Spring-EL 的任何功能都可以在表达式中使用,因此您也可以访问参数的属性。例如,如果您想让某个特定方法只允许用户名与联系人用户名匹配的用户访问,您可以这样写
@PreAuthorize("#contact.name == principal.name)")
public void doSomething(Contact contact);
这里我们正在访问另一个内置表达式,即当前 Spring Security 的“principal”Authentication对象,该对象从安全上下文中获取。您也可以直接访问Authentication对象本身,使用表达式名称“authentication”。授权也可以在方法调用发生后执行,使用@PostAuthorize注解。要访问方法的返回值,请在表达式中使用内置名称“returnObject”。
@PreAuthorize("hasRole('ROLE_USER')")
@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, 'admin')")
public List getAll();
与@PostFilter注解一起使用时,Spring Security 会遍历返回的集合,并移除其中提供的表达式为 false 的任何元素。“filterObject”名称指的是集合中的当前对象。您也可以在方法调用之前进行过滤,使用@PreFilter,尽管这可能是一个不太常见的需求。语法完全相同,但如果存在多个集合类型的参数,您需要使用此注解的“filterTarget”属性按名称选择其中一个。
Spring Security 2.0.4 包结构
Jar 包名称 | 描述 | 何时使用 | 根包 |
---|---|---|---|
spring-security-core | 核心身份验证和访问控制类及接口。远程调用支持和基本资源供应 API。 | 使用 Spring Security 的任何应用程序都必需。支持独立应用程序、远程客户端、方法(服务层)安全和 JDBC 用户资源供应。 | org.springframework.security.core , org.springframework.security.access , org.springframework.security.authentication , org.springframework.security.provisioning , org.springframework.security.remoting |
spring-security-web | 过滤器和其他 Web 安全基础设施及相关代码。任何依赖于 servlet API 的内容。 | 如果您需要 Spring Security Web 身份验证服务和基于 URL 的访问控制 | org.springframework.security.web |
spring-security-config | 命名空间解析代码。 | 如果您正在使用 Spring Security XML 命名空间。 | org.springframework.security.config |
spring-security-ldap | LDAP 身份验证和资源供应代码。 | 如果您需要使用 LDAP 身份验证或管理 LDAP 用户条目。 | org.springframework.security.ldap |
spring-security-acl | 域对象 ACL 实现。 | 如果您需要在应用程序中对特定的域对象实例应用安全性。 | org.springframework.security.acls |
spring-security-cas-client | Spring Security 的 CAS 客户端集成。 | 如果您想将 Spring Security Web 身份验证与 CAS 单点登录服务器一起使用。 | org.springframework.security.cas |
spring-security-openid | OpenID Web 身份验证支持。 | 如果您需要针对外部 OpenID 服务器进行用户身份验证。 | org.springframework.security.openid |
Spring Security 3.0.0.M1 Jar 包依赖
Spring Security 3.0.0.M1 包结构
core
包及其子包包含框架中使用的基本类和接口,核心 jar 包中的另外两个主要包是 authentication
和 access
。access
包包含访问控制/授权代码,例如 AccessDecisionManager
及相关的基于投票器的实现、拦截和方法安全基础设施、注解类以及对 Spring Security 3.0 基于表达式的访问控制的支持。authentication
包包含 AuthenticationManager
及相关类(例如身份验证异常类)、简单的基于 DAO 的身份验证提供者和密码编码器。项目网站也已更新。FAQ 添加了一些新问题,并且有一个新页面包含演示视频和在线文章的链接。请查看并告知我们您希望在那里看到什么(外部安全链接页面已在计划中)。
Spring Security 3 仍有很多工作要做,但我们希望您能尝试这个里程碑版本,并就新的表达式语言支持提供反馈。您可以在 Jira ChangeLog 中找到截至目前为止的完整变更列表,您还可以在那里找到当前项目路线图的链接。
社区论坛是提问关于使用 Spring Security 或发起关于新功能讨论的最佳场所。另外,如果您发现任何问题,可以提交一个 Jira Issue。
希望您喜欢使用 Spring Security。