Вопрос по vaadin, spring-security, spring, java – Java Config для Spring Security с Vaadin

7

Я новичок в этих платформах (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, Поэтому я использую этот класс контроллера:

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

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

Ваш Ответ

1   ответ
5

Какой .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() часть, вы уже включаете.permitAll() для этой страницы.

Теперь для статических ресурсов (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 будет использовать для определения, будет ли доступ разрешен или нет, будет/UIDL/hello

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

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

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

ОБНОВИТЬ Ответы на комментарии к вопросам:

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

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

источник

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

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

источник

Я мог бы вообразить значение «/ *» и «/ **», но что на самом деле означает «UIDL» и «HEARTBEAT»? Почему они разрешены?

UIDL:

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

источник

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

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

Спасибо за ваш ответ. 1. Почему вы используетенастроить (WebSecurity web) метод с игнорированием ресурсов вместонастроить (HttpSecurity http) с разрешением доступа? Есть ли существенные различия? 2. Почему вы игнорируете путь "/ VAADIN / **"? 3. Я мог бы вообразить значение «/ *» и «/ **», но что на самом деле означают «UIDL» и «HEARTBEAT»? Почему они разрешены? shinchillahh

Похожие вопросы