我对这些框架(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类:
@Controller
public class LoginController
{
@RequestMapping("/login")
String login(Model model)
{
return "login";
}
}
如果用户未登录,是否要阻止应用程序的每个请求,我应该定义哪个.antMatchers()?我知道我必须为登录页面定义antMatchers(“/resources/**”)。permitAll()以获得CSS和图像。但是这些模式如“/UIDL/**”是什么,我需要它们做什么?
最佳答案
如果您只想在用户未登录的情况下阻止每个请求,请执行以下操作:
@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,图像),并牢记VAADIN,您可以执行此方法来覆盖另一种方法:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers("/resources/**", "/VAADIN/**");
}
在Spring Boot项目中,如果我不允许
"/vaadinServlet/**"
中的web.ignoring().antMatchers(...)
请求,我也发现了问题。当服务器接收到请求时,Spring Security使用这些模式来确定它是否应允许或拒绝对该请求的访问。
它们代表应用程序上下文根之后的URI部分,例如如果您的上下文根是
/
,那么诸如http://server.com/UIDL/hello
之类的请求(Spring Security将用来确定是否授予访问权限的URI部分)将是/UIDL/hello
**
代表任何内容,包括任何子级别,例如对于/UIDL/**
模式,请求/UIDL/hello/world/and/any/more/levels
将匹配。还有一个
*
代表任何内容,但不包括子级别,例如对于/UIDL/*
模式,请求/UIDL/hello
将匹配,但/UIDL/hello/world
不匹配。对于VAADIN View 和UI,我不确定是否可以使用
antMatchers
授予或拒绝访问,但是您可以使用@EnableGlobalMethodSecurity(prePost = enabled)
注释配置类,然后能够在 View 上使用@PreAuthorize( /* spel expression */)
注释来授予权限或拒绝访问。更新:回答评论问题:
区别在于
WebSecurity#ignoring()
使请求从Spring Security过滤器链中被跳过,这是静态资源的推荐方法,除静态资源外,其他任何事情都应在configure(HttpSecurity http)
内部处理。source
由于该路径用于服务主题,窗口小部件集和自定义项(它们是静态内容),因此该路径用于从Vaadin jar中动态地为其提供服务,但是正如Vaadin文档中所建议的那样,在生产环境中,该路径应以静态方式提供,例如它更快。
source
UIDL:
source
定期执行心跳请求,以验证服务器和客户端之间的连接仍然有效,或者 session 尚未过期。
source - see sections 4.8.5, 4.8.6, 4.8.7 and 4.8.8