Конфигурация Java для весенней безопасности с Vaadin

Im новый для этих фреймворков (Vaadin:7.6.1, Spring Security:4.0.3), и я спрашиваю себя, как настроить авторизованные запросы, если я хочу создать приложение Vaadin.

Я посмотрел несколько примеров, где написано что-то вроде этого:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{

    [...]

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .authorizeRequests()
                .antMatchers("/login**").permitAll()
                .antMatchers("/UIDL/**").permitAll()
                .antMatchers("/HEARTBEAT/**").authenticated()
                .antMatchers("/VAADIN/**").permitAll()
                .antMatchers("/resources/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin().loginPage("/login").permitAll()
                .and()
            .logout().permitAll()
                .and()
            .csrf().disable();
    }
}

потому что я хочу создать страницу входа в систему, я использую Thymeleaf engine. Поэтому я использую этот класс:

@Controller
public class LoginController
{
    @RequestMapping("/login")
    String login(Model model)
    {
        return "login";
    }
}

что .antMatchers () должен ли я определить, хочу ли я заблокировать все запросы моего приложения, если пользователь не вошел в систему? Я знаю, что мне нужно определить antMatchers("/resources/**").permitAll () для страницы входа в систему, чтобы получить css и изображения. Но что это за Шаблоны, такие как" /UIDL/** " и для чего они мне нужны?

1 ответов


что .antMatchers () должен ли я определить, хочу ли я блокировать каждый запрос из моего приложения, если пользователь не вошел в систему?

если вы просто хотите заблокировать каждый запрос, если пользователь не вошел в систему:

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login").permitAll()
            .and()
        .logout().permitAll()
            .and()
        .csrf().disable();
}

вам на самом деле не нужно antMatcher, даже не для страницы входа в систему, как в .formLogin() часть, вы уже включайте!--4--> для этой страницы.

теперь для статических ресурсов (css, js, images) и с учетом VAADIN вы можете сделайте это, переопределяя другой метод:

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

С проектом Spring Boot я также нашел проблемы, если я не разрешал запросы "/vaadinServlet/**"на web.ignoring().antMatchers(...).

каковы эти шаблоны, как " / UIDL / **" и для чего они мне нужны?

когда сервер получает запрос, Spring Security использует эти шаблоны, чтобы определить, должен ли он разрешить или запретить доступ к запросу.

они представляют часть URI после контекстный корень вашего приложения, например, в случае вашего корневого контекста /, то запрос http://server.com/UIDL/hello часть URI, которую Spring Security будет использовать для определения wether, чтобы дать доступ или нет, будет /UIDL/hello

на ** представляет все, включая любой подуровень, например, для /UIDL/** узор, запрос /UIDL/hello/world/and/any/more/levels будет соответствовать.

есть еще один * который представляет, что угодно, но не включая подуровни, например для /UIDL/* узор, запрос /UIDL/hello будет соответствовать, но не /UIDL/hello/world.

что касается представлений VAADIN и UIs, я не уверен, что можно использовать antMatchers разрешить или запретить доступ, но вместо этого вы можете комментировать класс конфигурации с @EnableGlobalMethodSecurity(prePost = enabled) и затем иметь возможность использовать @PreAuthorize( /* spel expression */) аннотации к представлениям для предоставления или запрета доступа.

обновление: ответы на вопросы комментариев:

  1. почему вы используете configure(WebSecurity web) метод с игнорированием ресурсов вместо configure (HttpSecurity http) с разрешением доступа? Есть ли существенные различия?

разница в том, что WebSecurity#ignoring() делает запрос пропущенный от цепи фильтра безопасностью Весны, и порекомендованный путь для статический ресурсы, что-нибудь еще, кроме статических ресурсов, должно быть обработано внутри configure(HttpSecurity http).

источник

  1. почему вы игнорируете путь"/ VAADIN/**"?

поскольку этот путь используется для обслуживания тем, наборов виджетов и настроек, которые являются статическим содержимым, путь используется для его динамического обслуживания из Vaadin jar, но, как предлагается в документации Vaadin, в производственных средах должен обслуживаться статически, так как это быстрее.

источник

  1. я мог представить себе значение "/ * "и"/**", Но что на самом деле означают" UIDL "и" HEARTBEAT"? Почему они разрешены?

протокол uidl:

язык определения пользовательского интерфейса (UIDL) является языком для сериализация содержимого пользовательского интерфейса и изменений в ответах из интернета сервер для браузера. Идея заключается в том, что серверные компоненты "покрасить" себя в экран (веб-страница)с языком. Этот Сообщения UIDL анализируются в браузере и переводятся в виджеты GWT.

источник

Heartbeat запросы выполняются периодически, чтобы проверить, что соединение все еще живо между сервером и клиентом, или сеанс не истек.

источник - см. разделы 4.8.5, 4.8.6, 4.8.7 и 4.8.8