我对这些框架(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 */)注释来授予权限或拒绝访问。

更新:回答评论问题:
  • 为什么在忽略资源的情况下使用configure(WebSecurity web)方法,而不在允许访问的情况下使用configure(HttpSecurity http)?有显着差异吗?

  • 区别在于WebSecurity#ignoring()使请求从Spring Security过滤器链中被跳过,这是静态资源的推荐方法,除静态资源外,其他任何事情都应在configure(HttpSecurity http)内部处理。

    source
  • 为什么您忽略“/VAADIN/**”路径?

  • 由于该路径用于服务主题,窗口小部件集和自定义项(它们是静态内容),因此该路径用于从Vaadin jar中动态地为其提供服务,但是正如Vaadin文档中所建议的那样,在生产环境中,该路径应以静态方式提供,例如它更快。

    source
  • 我可以想象“/*”和“/**”的含义,但是“UIDL”和“HEARTBEAT”实际上是什么意思?为什么允许他们?

  • UIDL:



    source

    定期执行心跳请求,以验证服务器和客户端之间的连接仍然有效,或者 session 尚未过期。

    source - see sections 4.8.5, 4.8.6, 4.8.7 and 4.8.8

    09-10 03:00