que - Cómo simular el contexto de seguridad en Spring MVC para probar
spring mvc que es (2)
Añadir en 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>
y use org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors
para la solicitud de autorización. Vea el uso de la muestra aquí , y el boleto Spring.io jira SEC-2592 .
Necesito probar algunas direcciones URL protegidas, por lo tanto, necesito configurar un contexto de seguridad falso en mis pruebas (junit).
En particular, necesito realizar algunos get y post en contra de mi aplicación web, usando un usuario autenticado. Debajo está mi código, puedo crear un contexto de seguridad de este tipo, pero necesito insertarlo en el objeto ''MockMvc''.
Establecí el objeto de autenticación en el contexto de seguridad y funciona, el resultado de ''SecurityContextHolder.getContext (). GetAuthentication (). GetPrincipal ()'' es [email protected] pero cuando llamo a GET en / profile I tener un error de aserción porque me redirigen a mi página de inicio de sesión, y no a / perfil.
@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
}
Supongo que debería poner mi objeto de autenticación dentro del objeto MockMvc, pero no sé cómo
¿Alguien tiene alguna idea?
Esto es algo que escribí hace unos días. Creo que podría ser útil (probé lo mismo con el formulario de inicio de sesión, usando la sesión para la segunda solicitud) ver loginUser1Ok (..))
Ver MvcTest.java en