Конфигурация 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 */)
аннотации к представлениям для предоставления или запрета доступа.
обновление: ответы на вопросы комментариев:
- почему вы используете configure(WebSecurity web) метод с игнорированием ресурсов вместо configure (HttpSecurity http) с разрешением доступа? Есть ли существенные различия?
разница в том, что WebSecurity#ignoring()
делает запрос пропущенный от цепи фильтра безопасностью Весны, и порекомендованный путь для статический ресурсы, что-нибудь еще, кроме статических ресурсов, должно быть обработано внутри configure(HttpSecurity http)
.
- почему вы игнорируете путь"/ VAADIN/**"?
поскольку этот путь используется для обслуживания тем, наборов виджетов и настроек, которые являются статическим содержимым, путь используется для его динамического обслуживания из Vaadin jar, но, как предлагается в документации Vaadin, в производственных средах должен обслуживаться статически, так как это быстрее.
- я мог представить себе значение "/ * "и"/**", Но что на самом деле означают" UIDL "и" HEARTBEAT"? Почему они разрешены?
протокол uidl:
язык определения пользовательского интерфейса (UIDL) является языком для сериализация содержимого пользовательского интерфейса и изменений в ответах из интернета сервер для браузера. Идея заключается в том, что серверные компоненты "покрасить" себя в экран (веб-страница)с языком. Этот Сообщения UIDL анализируются в браузере и переводятся в виджеты GWT.
Heartbeat запросы выполняются периодически, чтобы проверить, что соединение все еще живо между сервером и клиентом, или сеанс не истек.