У меня вопрос о конфигурации безопасности Spring.
Предположим, у меня есть два разных внутренних класса, которые расширяют WebSecurityConfigurerAdapter, используют собственные реализации UserDeatailsService и настраивают HttpSecurity.
Насколько я понимаю, каждый класс будет иметь локальный AuthenticationManager, построенный с переопределенной функцией configure(AuthenticationManagerBuilder auth)
и собственной цепочкой фильтров, настроенной с помощью configure(HttpSecurity http)
.
Теперь, если мне нужно предоставить разные настраиваемые фильтры UsernamePasswordAuthenticationFilter для обеих цепочек фильтров, как мне сделай это? Чтобы настроить UsernamePasswordAuthenticationFilter, нам необходимо предоставить AuthenticationManager, и обычно это делается путем переопределения authenticationManagerBean ().
@Bean(name = "adminAuth") //BeanIds.AUTHENTICATION_MANAGER
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean(name = "adminFilter")
public UsernamePasswordAuthenticationFilter authenticationFilter() throws Exception {
UsernamePasswordAuthenticationFilter filter = new UsernamePasswordAuthenticationFilter();
filter.setUsernameParameter("email");
filter.setAuthenticationManager(authenticationManagerBean());
filter.setFilterProcessesUrl(LOGIN_PROCESSING_URL);
filter.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/admin/*", "POST"));
return filter;
}
Но, как я понимаю, authenticationManagerBean()
глобально предоставляет родительский экземпляр AuthenticationManager, так откуда же Manager знает, какой цепочка фильтров, чтобы добавить настраиваемый фильтр? И как фильтр узнает, что он предполагает использовать локальный менеджер (например, укажите c UserDetailsServiceImpl)?