Ответ 1
Это то, что я написал несколько дней назад. Я думаю, что это может быть полезно (я тестировал то же самое против формы входа, используя сеанс для второго запроса) см. LoginUser1Ok (..))
См. MvcTest.java в
Мне нужно протестировать некоторые защищенные URL-адреса, поэтому мне нужно настроить макет безопасности в моих тестах (junit).
В частности, мне нужно выполнить некоторые действия и опубликовать их против моего веб-приложения, используя аутентифицированного пользователя.
Ниже мой код, я могу создать такой контекст безопасности, но мне нужно ввести его в объект "MockMvc".
Я установил объект аутентификации в контексте безопасности, и он работает, результат вывода "SecurityContextHolder.getContext(). GetAuthentication(). GetPrincipal() - это [email protected], но когда я вызываю GET on/profile я имеют ошибку утверждения, потому что я перенаправлен на мою страницу входа, а не в /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, но я не знаю, как Кто-нибудь знает?
Это то, что я написал несколько дней назад. Я думаю, что это может быть полезно (я тестировал то же самое против формы входа, используя сеанс для второго запроса) см. LoginUser1Ok (..))
См. MvcTest.java в
Добавить в 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 ticket SEC- 2592.