Использование Spring MVC 3.2 с Spring Security 3.1Mocking Spring менеджер глобальной аутентификации
Target контейнере JBoss 4 (не спрашивайте), так сервлет API еще 2,4. При тестировании конфигурации безопасности Spring она записывается в XML и вставляется в web.xml с кучей других вещей. Думал, что я напишу небольшой тестовый слой JUnit, который издевается над основным запросом и вызывает проверку подлинности проверки безопасности Spring. Идея заключалась в том, чтобы помочь другим разработчикам проверить конфигурацию безопасности, прежде чем интегрировать ее в остальную часть проекта.
Во всяком случае, если я не определить менеджера аутентификации в XML безопасности я получаю:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.security.authenticationManager' is defined: Did you forget to add a gobal <authentication-manager> element to your configuration (with child <authentication-provider> elements)? Alternatively you can use the authentication-manager-ref attribute on your <http> and <global-method-security> elements.
Мой тест JUnit класс выглядит следующим образом:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {LdapSecurityTest.WebAppConfig.class,
LdapSecurityTest.WebSecurityConfig.class})
public class LdapSecurityTest {
@Controller
public static class DummyController {
@RequestMapping(value = "/blankettservice/admin/test", method = RequestMethod.GET)
@ResponseBody
public String hello() {
return "hello world";
}
}
@EnableWebMvc
@Configuration
@ComponentScan("se.bolagsverket.insidan.web.common")
public static class WebAppConfig {
}
@Configuration
@ImportResource({"classpath:applicationContext-security.xml"})
public static class WebSecurityConfig {
@Autowired
private List<AuthenticationProvider> providers;
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(providers);
}
}
public class SpringInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
AnnotationConfigWebApplicationContext ctx =
new AnnotationConfigWebApplicationContext();
ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("dispatcher", new DispatcherServlet(
ctx));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
servletContext.addFilter("springSecurityFilterChain",
new DelegatingFilterProxy("springSecurityFilterChain"))
.addMappingForUrlPatterns(null, false, "/*");
}
}
@Resource
private WebApplicationContext context;
@Test
public void initialize() throws Exception {
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken("user", "password"));
MockMvc mvc = webAppContextSetup(context).build();
mvc.perform(get("/blankettservice/admin/test")).andExpect(status().isOk())
.andExpect(content().string("hello world"));
;
}
}
Просто для ясности ApplicationContext-безопасности выглядит следующим образом:
<http>
<intercept-url pattern="/**/blankettservice/admin/**"
access="ROLE_BLANKETTSERVICE_ADMIN" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<http-basic />
<anonymous />
</http>
<beans:bean id="contextSource"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<beans:constructor-arg value="ldap://server:port" />
<beans:property name="userDn" value="..." />
<beans:property name="password" value="..." />
</beans:bean>
<beans:bean id="bvLdapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider>
....
</beans:bean>
Бранд-провайдер ProviderManager, который создан populat ed с поставщиком bvLdapAuthProvider.
Если я добавлю имя «org.springframework.security.authenticationManager» в мой компонент AuthenticationManager, тогда ошибка исчезнет. –
Никогда не получает отказано в доступе. Это проблема сейчас. Посмотрите, что мой провайдер авторизации запущен, нет никакого соединения с HTTP-перехватом-url против «/ blankettservice/admin/test». –
Фильтр безопасности пружины никогда не инициализируется. Также не позвонил мой провайдер авторизации LDAP (инициализирован да, но не вызван для аутентификации). –