2013-01-25 68 views
3

我們的應用程序已經在使用彈簧安全的url過濾的單元測試:是否有可能創造春季安全截獲的url

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

我們想編寫一個單元測試,需要的URL和檢查的列表對於每種方法(GET,POST,PUT ..),如果它是可訪問的。

我在看使用DelegatingFilterProxy,但不確定如何在我們的web.xml中加載config/context

這是一種有效的方法或將是可取的?

+0

這是一個單元測試?你究竟在測試什麼 - 攔截url標籤的工作原理? – blank

+0

看起來你想要一個集成測試。如果這是真的,那麼請更正您的問題。 –

+0

單元測試的目的是確保** vs *被正確指定。當我們需要「/ resource/**」時,我們遇到了使用「/ resource *」模式的問題。 因此,用資源/訪問服務的用戶正在獲取拒絕訪問錯誤。 – johnflan

回答

0

您可以通過@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的外部模塊。

+0

因此,過濾規則不會作爲FilterChain的一部分存儲,我擔心MockFilterChain會刪除我定義的攔截url規則。 – johnflan

+1

正確。 規則存儲(間接)在FilterChainProxy中。更具體地說,FilterChainProxy創建了自己的FilterChain內部實現,用於調用每個Spring Security Filters,因此MockFilterChain不會影響它。 –

0

在我的測試攔截的URL的參與:

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