Spring Security团队发布了Spring Security 4.0.0,不但提供了更多缺少的安全性,还增加了几个新的特性。重要主题包括WebSocket安全性、Spring Data 集成、更好的测试支持,并引进了Apache许可的开源项目Spring Session。Spring Session作为项目的HttpSession提供者,从而简化客户端的开发。这样开发人员就可以从任何环境中访问会话了,它支持集群环境,具有可插拔的 session-id 策略并支持websockets。
WebSocket 安全性
Spring's WebSocket 已支持Spring的安全性,但尚未针对 JSR-356(Java API for WebSocket) 提供直接的支持。你可以使用如下Spring的Java Configuration在websocket通道上配置安全性。
@Configuration public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { messages.simpDestMatchers("/user/*").authenticated(); } }
Spring Data 集成
现在可以用SpEL在 Spring Data 查询语句内获取当前用户了。如何要使用这个特性,你需要定义一个@Bean。
@Bean public SecurityEvaluationContextExtension securityEvaluationContextExtension(){ return new SecurityEvaluationContextExtension(); }
然后,你就可以在查询语句中引用Spring Security的当前用户了。示例如下:
public interface BlogRepository extends JpaRepository { @Query("select blog from Blog blog where blog.user.login = ?#{principal.username}") List findAllForCurrentUser(); }
提升测试的支持
Spring Security 4.0 增加了许多的注解以简化需要认证的测试方法。例如,如果你有一个方法带有@PreAuthorize(“已认证”),可以用以下的机制予以测试:
Spring Security 4.0也可以和Spring MVC Test (4.1.3+)一起使用。如下示例演示了集成这两个框架要执行的所有设置。
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @WebAppConfiguration public class CsrfShowcaseTests { @Autowired private WebApplicationContext context; private MockMvc mvc; @Before public void setup() { mvc = MockMvcBuilders .webAppContextSetup(context) .apply(springSecurity()) .build(); } … }
从Spring Security 3.x 到 4.x的迁移
Spring Security团队发表了一篇《从Spring Security 3.x 到 4.x的迁移指南》。它包括XML配置文件和Java Configuration的迁移指令。甚至,它还在一份迁移示例中提供了一份差异列表,高亮显示了需要修改的内容:
Spring Security 4.0 Java Configuration
最基本的Spring Security是用 Java configuration 创建一个Servlet Filter,它对所有的安全负责(URL保护、证书验证、登录重定义等等)。它只有几行代码,而且有一半是类的导入。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.*; import org.springframework.security.config.annotation.authentication.builders.*; import org.springframework.security.config.annotation.web.configuration.*; @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password("password").roles("USER"); } }
代码不多,却提供了许多的特性:
要在Spring Boot 1.2项目中使用这个版本,你需要按如下写法覆盖Spring Security版本:
<properties> <spring-security.version>4.0.0.RELEASE</spring-security.version> </properties>
要了解更多的Spring Security 4.0信息,请查阅Spring Security领导Rob Winch在InfoQ的演讲:《Spring Security 4.0从零开始》。点击此处可获得本次演讲的幻灯片。
查看英文原文:Spring Security 4.0: WebSocket, Spring Data and Test Support