Spring Security 4.0: WebSocket、Spring Data 和 Test Support

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(“已认证”),可以用以下的机制予以测试:

  • @WithMockUser: 把它增加到一个@Test方法里,该方法的用户名为“user”,密码为“password”,角色为“ROLE_USER”。你可以在注解中用具体的参数值覆盖这些参数:比如@WithMockUser(username="admin",roles={"USER","ADMIN"})
  • @WithUserDetails: 与@WithMockUser类似,但是可以自定义认证,减少与 Spring Security 的耦合。
  • @WithSecurityContext: 提供了最大的灵活性,你可以用它创建自己定制的测试注解。

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的迁移指令。甚至,它还在一份迁移示例中提供了一份差异列表,高亮显示了需要修改的内容:

  • 使用XML配置文件时从Spring Security 3.x 到 4.x的迁移
  • 使用Java ConfigurationSpring Security 3.x 到 4.x的迁移

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");
    }
}

代码不多,却提供了许多的特性:

  • 应用中的每个URL都需要经过认证
  • 为你生成一个登录表单
  • 允许以用户密码的方式进行认证
  • 允许用户登出
  • 预防CSRF攻击
  • 会话固定保护
  • 安全标头整合
    • 针对安全请求的HTTP Strict Transport Security
    • 整合X-Content-Type-Options
    • 缓存控制
    • 整合X-XSS-Protection
    • 整合X-Frame-Options以协助预防点击劫持
  • 集成HttpServletRequest API 方法:getRemoteUser()、getUserPrinciple()、isUserInRole(role)、login(username, password) 和 logout()

要在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

你可能感兴趣的:(Spring Security 4.0: WebSocket、Spring Data 和 Test Support)