Как я могу разрешить публичный доступ к частям приложения Spring Security с помощью allowAll? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь получить приложение Spring, чтобы разрешить некоторые запросы общедоступным (без входа в систему) и некоторые запросы частным (при входе в систему).

На данный момент я бы хотел получить общедоступныечасть для правильной работы.

Я пробовал большинство примеров конфигураций, перечисленных в документации по Spring Security, включая всевозможные комбинации anonymous () и allowAll ().Все заканчивают тем, что перенаправили на страницу входа.

  protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
        .antMatchers("/resources/**", "/signup", "/about","/api/home").permitAll()                
            .antMatchers("/admin/**").hasRole("ADMIN")                                    
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")      
            .anyRequest().authenticated()                                             
            .and()
        // ...
        .formLogin();
    }

Ожидаемый результат: элементы в allowAll () доступны без входа в систему

Фактический результат:

перенаправить на страницу входа.Это отображается в журнале: 2019-06-06 17: 29: 43.593 INFO 56330 --- [main] ossweb.DefaultSecurityFilterChain: создание цепочки фильтров: любой запрос, [org.sprin ...

Это наводит меня на мысль, что он даже не читает эту конфигурацию.Есть ли способ исправить это?

Спасибо!

ОБНОВЛЕНИЕ: Я попытался добавить игнорирование веб-безопасности, и он, кажется, не работает до сих пор.По-видимому, он по-прежнему печатает ошибку «defaultsecuritychain», поэтому я чувствую, что это может быть как-то связано с этим.

ОБНОВЛЕНИЕ 2: Добавлен файл application.properties в каталоге src / main / resources с этой строкой logging.level.org.springframework.security = DEBUG, чтобы протоколировать отладочные сообщения.

pastebin.com / 2u9k7eHD

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Вы можете выполнить ваши требования с помощью следующих конфигураций.Это хороший способ использовать URL-адреса, для которых не требуется помещать аутентификацию / авторизацию в WebSecurity using ignoring instead of HttpSecurity as WebScurity will bypass the Spring Security Filter Chain and reduce the execution time

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**", "/signup", "/about","/api/home");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")                                    
        .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") 
        .anyRequest().authenticated()
        .yourConfigurations
}

Когда вы используете HttpSecurity и пытаетесь permitAll() запросов.Ваши запросы будут разрешены для доступа из цепочки фильтров Spring Security.Это дорого, так как будут запросы на другие запросы, которые также входят в эту цепочку фильтров, которые должны быть разрешены или запрещены на основе аутентификации / авторизации

Но когда вы используете WebSecurity, любые запросы к "/resources/**", "/signup", "/about","/api/home"будет полностью проходить цепь фильтра безопасности Spring все вместе.Это безопасно, потому что вам не нужна никакая аутентификация / авторизация, чтобы увидеть изображение или прочитать файл javascript.

0 голосов
/ 07 июня 2019

Взгляните на http://blog.florian -hopf.de / 2017/08 / spring-security.html , он может объяснить ваш вариант использования более подробно.

Моя рекомендация - попробовать использовать WebSecurity для статических и общедоступных ресурсов.

public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/resources/**", "/signup", "/about","/api/home");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...