web-dev-qa-db-ja.com

テストのためにSpring MVCのセキュリティコンテキストをモックする方法

いくつかの保護されたURLをテストする必要があるため、テスト(junit)でモックセキュリティコンテキストを設定する必要があります。
特に、認証されたユーザーを使用して、Webアプリケーションに対していくつかの取得と投稿を実行する必要があります。その下に私のコードがあります。そのようなセキュリティコンテキストを作成できますが、「MockMvc」オブジェクトに挿入する必要があります。
認証オブジェクトをセキュリティコンテキストに設定して機能します。「SecurityContextHolder.getContext()。getAuthentication()。getPrincipal()」の出力結果は[email protected]ですが、/profileでGET/profileではなくログインページにリダイレクトされるため、アサーションエラーが発生します。

@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:spring/security.xml", "classpath:spring/view.xml"})
@ActiveProfiles("default")
@RunWith(SpringJUnit4ClassRunner.class)
public class AuthenticationTest {

@Autowired
WebApplicationContext ctx;

private MockMvc mockMvc;

@Autowired
private FilterChainProxy springSecurityFilterChain;

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
    mockMvc = MockMvcBuilders.webAppContextSetup(ctx).addFilters(springSecurityFilterChain).build();

    //@formatter:off

    UserDetailsLogic userDetailsLogic = null;
    userDetailsLogic = ctx.getBean(UserDetailsLogic.class);
    final UserDetailsImp userDetailsImp = new UserDetailsImp();
    userDetailsImp.setAccountId(1001);
    userDetailsImp.setUserId(8001);
    userDetailsImp.setPassword("a378c92df7531df6fdf351f7ae1713f91f2dd2d45b9c6e1a8b02736ee3afec6595ff60465e9cb8da");
    userDetailsImp.setUsername("[email protected]");
    userDetailsImp.setEmail("[email protected]");

    final Collection<GrantedAuthorityImplementation> authorities= new ArrayList<GrantedAuthorityImplementation>();
    authorities.add(new GrantedAuthorityImplementation("ROLE_USER"));

    userDetailsImp.setAuthorities(authorities);

    userDetailsImp.setAccountNonExpired(true);
    userDetailsImp.setAccountNonLocked(true);
    userDetailsImp.setCredentialsNonExpired(true);
    userDetailsImp.setEnabled(true);

    final Authentication authToken = new UsernamePasswordAuthenticationToken (userDetailsImp.getUsername(), userDetailsImp.getPassword(), userDetailsImp.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(authToken);

    System.out.println("principal:"+SecurityContextHolder.getContext().getAuthentication().getPrincipal());      
    mockMvc.perform(get("/profile").principal(authToken)

            .contentType(MediaType.TEXT_HTML)

            .accept(MediaType.TEXT_HTML))

            .andDo(print())

            .andExpect(status().isOk())
            .andExpect(redirectedUrl(null))
            .andExpect(forwardedUrl(null));
    //@formatter:on     
}

認証オブジェクトをMockMvcオブジェクト内に配置する必要があると思いますが、方法がわかりません
誰かが何か考えを持っていますか?

17
cloudy_weather

これは数日前に書いたものです。私はそれが役立つと思います(2番目のリクエストにセッションを使用して、ログインフォームに対して同じことをテストしました)loginUser1Ok(..)を参照してください)

参照 MvcTest.Java

m4nuv/easy-bank

12
Emanuele Ivaldi

Pom.xmlに追加

<repository>
    <id>spring-snaspho</id>
    <url>http://repo.springsource.org/libs-milestone/</url>
</repository>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.0.M1</version>
</dependency>

org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors承認リクエスト。 サンプルの使用方法はこちら 、および Spring.io jiraチケットSEC-2592

3
Grigory Kislin