Spring Security: DelegatingFilterProxy переполняет стек

384
08 ноября 2017, 00:20

Настраиваю Spring Security и столкнулся с проблемой когда в конфигурации указано доступ к определенным адресам предоставлять только при авторизации все равно можно обратится к ним без авторизации.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .anyRequest().authenticated();
    }
}
@RestController
public class TestController {
    @PostMapping(value = "/test")
    public List<String> postHello(@RequestBody ArrayList<String> strings){
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return strings
                .stream()
                .map(s -> "Print "+s)
                .collect(Collectors.toList());
    }
}

При такой конфигурации я отправлю запрос на http://localhost:8080/test в тело запроса помещаю ["one","two"] и ожидаю что запрос не пройдет так как в настройках Spring Security я указал, что все пути должны проходить проверку авторизации anyRequest().authenticated().

После просмотра гугла я увидел, что возможно проблема заключается в том, что в web.xml нет настроек фильтра.

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
        org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>springSecurityFilterChain</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

После добавления фильтра я получаю ошибку что нет такого бина springSecurityFilterChain. Иду добавлять бин в конфиг...

<bean 
        id="springSecurityFilterChain" 
        class="org.springframework.web.filter.DelegatingFilterProxy"/>

Сервер стратует нормально, но стоит отправить запрос как получаю следующую ошибку:

javax.servlet.ServletException: Filter execution threw an exception
java.lang.StackOverflowError
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
...
...

Не могу понять, что именно я делаю не так. Возможно этот фильтр вообще не нужен и нужно лишь подправить конфиги. Если кто то уже сталкивался с такой проблемой буду благодарен за помощь.

build.gradle
application-context.xml
dispatcher-servlet.xml
web.xml

Answer 1

Нашел по какой причине не запускался фильтр DelegatingFilterProxy.
Проблема была в том что dispatcher-servlet.xml был не прописан в web.xml.

После добавления в web.xml следующего блока, все заработало корректно:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/application-context.xml /WEB-INF/dispatcher-servlet.xml</param-value>
</context-param>
READ ALSO
FileProveder ошибка Failed to find configured root that contains

FileProveder ошибка Failed to find configured root that contains

Использую такую конструкцию для преобразования ArrayList list в *csw файл, для дальнейшей отправки его через Gmail, etc

526
Не инжектится ejb

Не инжектится ejb

Здравствуйте, у меня есть сервлет который работает и все отображаетОн примерно такой

453
Как зашифровать String в андроид?

Как зашифровать String в андроид?

Добрый деньВ коде имеется final String, содержание которой очень не хотелось бы, чтобы его узнали при декомпиляции

225
Ошибка в retrofit2

Ошибка в retrofit2

Доброго времени сутокПри попытке retrofit2

274