Tengo que probar algunas urls protegidas, por lo tanto tengo que configurar un simulacro de contexto de seguridad en mis pruebas (junit).

En particular, necesito realizar algunas obtiene y post en contra de mi aplicación web, mediante un usuario autenticado.
A continuación no es de mi código, soy capaz de crear un contexto de seguridad, pero tengo que inyectar en el ‘MockMvc’ objeto.

Me puse el objeto de autenticación en el contexto de seguridad y funciona, el resultado de salida de ‘SecurityContextHolder.getContext().getAuthentication().getPrincipal()’ es [email protected] pero cuando me llaman el subir /perfil tengo un error de aserción porque yo soy redirigido 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 debo poner mi objeto de autenticación dentro de la MockMvc objeto, pero no sé cómo

¿Alguien tiene alguna idea?

2 Comentarios

  1. 12

    Esto es algo que escribí hace unos días. Creo que podría ser útil (he probado lo mismo en contra de la forma de inicio de sesión, utilizando el período de sesiones de la segunda petición) ver loginUser1Ok(..))

    Ver MvcTest.java en

    m4nuv/easy-banco.

    • Hola Manuel, gracias por tu respuesta, me terminó exactamente con la misma solución.
    • El código de ejemplo que siempre fue muy útil para mí! Gracias!
    • Es agradable la forma de inicio de sesión para obtener una sesión y, a continuación, hacer su extremo de la llamada. Tenía la esperanza de crear un simulacro de sesión sin tener que realizar un inicio de sesión – suplantar las credenciales. El inicio de sesión se realiza por un servicio diferente que la estoy probando, por lo que esto no funciona para mí.
    • Hola, usted debe ser capaz de crear un simulacro de sesión y llenarlo con todo lo necesario y, a continuación, establecer el contexto, al hacer la solicitud.
  2. 3

    Agregar 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 uso org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors para la solicitud de autorización. Véase el ejemplo de uso aquí, y De la primavera.io jira billete SEC-2592.

Dejar respuesta

Please enter your comment!
Please enter your name here