【问题标题】:Is it possible to create unit tests for Spring security intercepted Urls是否可以为 Spring 安全拦截的 Urls 创建单元测试
【发布时间】:2013-01-25 11:59:25
【问题描述】:

我们的应用程序使用 spring security 过滤了 Urls,如下所示:

<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS,ROLE_USER"/>

我们想编写一个单元测试,它采用 URL 列表并检查每个方法(GET、POST、PUT..)是否可访问。

我正在考虑使用DelegatingFilterProxy,但不确定如何在我们的web.xml 中加载config/context

这是一种有效的方法还是可取的方法?

【问题讨论】:

  • 这是单元测试吗?你实际上在测试什么——intercept-url 标签是否有效?
  • 看起来你想要一个集成测试。如果属实,请更正您的问题。
  • 单元测试的目的是确保正确指定** vs *。我们遇到了一个问题,即当我们需要“/resource/**”时使用了“/resource*”模式。因此,使用 resource/ 访问服务的用户收到拒绝访问错误。

标签: unit-testing spring-security java-ee-5


【解决方案1】:

您可以通过@Autowire DelegatingFilterProxy 为您的拦截 URL 创建测试,并使用 MockHttpServletRequest、MockHttpServletResponse 和 MockFilterChain 来验证结果。

如果您使用的是 Spring MVC,您可以查看支持过滤器(包括 Spring Security)的 Spring Test MVC。你可以find a sample in the repository。请注意,Spring Test MVC 包含在 Spring 3.2+ 中(在 spring-test 模块中)。它也可以作为 Spring 3.1 的外部模块使用。

【讨论】:

  • 所以过滤规则没有存储为FilterChain的一部分,我担心MockFilterChain会删除我定义的intercept-url规则。
  • 正确。 规则存储(间接)在 FilterChainProxy 中。更具体地说,FilterChainProxy 创建自己的 FilterChain 内部实现,用于调用每个 Spring 安全过滤器,因此 MockFilterChain 不会影响它。
【解决方案2】:

在我的测试中涉及拦截网址:

@ContextConfiguration({
        "classpath:spring/spring-app.xml",
         ...
})
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
public class ControllerTest {

    private static final CharacterEncodingFilter CHARACTER_ENCODING_FILTER = new CharacterEncodingFilter();

    static {
        CHARACTER_ENCODING_FILTER.setEncoding("UTF-8");
        CHARACTER_ENCODING_FILTER.setForceEncoding(true);
    }

    protected MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @PostConstruct
    private void postConstruct() {
        mockMvc = MockMvcBuilders
            .webAppContextSetup(webApplicationContext)
            .addFilter(CHARACTER_ENCODING_FILTER)
            .apply(springSecurity())
            .build();
    }

    @Test
    public void testUsers() throws Exception {
        mockMvc.perform(get("/users")
            .with(authentication(new UsernamePasswordAuthenticationToken("user", "password")))
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(view().name("users"))
            .andExpect(forwardedUrl("/WEB-INF/jsp/users.jsp"));
    }
    ...

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2014-11-27
    • 2014-07-18
    • 2017-08-04
    • 1970-01-01
    • 2015-11-14
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多