Spring security 如何使用Spring Security处理Vaadin中被拒绝的访问

Spring security 如何使用Spring Security处理Vaadin中被拒绝的访问,spring-security,vaadin,vaadin7,Spring Security,Vaadin,Vaadin7,我很难让Vaadin和Spring Security(通过AD使用auth)很好地协同工作。我设法让身份验证位“足够好”(使用我自己的处理程序),但当我试图让授权位工作时,我会遇到更多的麻烦。让我们打破它,采取我们应该处理拒绝访问的方式 因此,我当然尝试过以“首选”的方式设置它,只需使用Springs“自动”拒绝访问处理程序,如下所示:,但这会从Vaadin弹出一条消息,说: “未能加载引导javascript:./VAADIN/vaadinBootstrap.js” 我还尝试了自己的自定义拒绝

我很难让Vaadin和Spring Security(通过AD使用auth)很好地协同工作。我设法让身份验证位“足够好”(使用我自己的处理程序),但当我试图让授权位工作时,我会遇到更多的麻烦。让我们打破它,采取我们应该处理拒绝访问的方式

因此,我当然尝试过以“首选”的方式设置它,只需使用Springs“自动”拒绝访问处理程序,如下所示:
,但这会从Vaadin弹出一条消息,说:

“未能加载引导javascript:./VAADIN/vaadinBootstrap.js”

我还尝试了自己的自定义拒绝访问处理程序。重写的
handle
方法被调用不少于20次,然后浏览器(在这种特殊情况下为FF)向我显示以下消息:

“页面未正确重定向 Firefox检测到服务器正在以一种永远无法完成的方式重定向对此地址的请求。 此问题有时可能是由于禁用或拒绝接受Cookie造成的。”

这很可能是因为用户未被授权重定向页面,但我将其设置为:
,我还尝试了
,导致上述“引导”错误

我做错了什么?为什么在这种情况下会调用Vaadin


编辑:添加了多次调用以处理方法的可能原因

您必须允许Vaadin特定路径并在spring security中禁用csrf。Vaadin在客户端和服务器之间有自己的csrf管理

例如,spring boot 1.3.0.RC1 java配置:

http.authorizeRequests().antMatchers("/VAADIN/**", "/PUSH/**", "/UIDL/**", "/vaadinServlet/UIDL/**").permitAll();
http.csrf().disable();

正如亚历山大所指出的,瓦丁有自己的风格。Spring Security CSRF是全局的,必须对所有请求完全关闭。另一个选项是创建一个小型请求匹配器,为每个请求启用或禁用Spring安全性。然后,您仍然可以对Vaadin应用程序之外的所有请求(如REST或其他页面)运行CSRF支持

在此配置中,URI
/
/support
下的所有请求都可以在不登录的情况下进行。URI
/open
下的所有内容都将由Spring CSRF功能处理,而其余部分(如Vaadin)将自行处理。

您需要允许(添加到antMatchers)所有Vaadin特定的拒绝路径。下面是一个配置方法覆盖的示例;am使用Spring身份验证,Vaadin作为/home下的主用户界面

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

因此,在Spring Csrf上需要忽略相同的Vaadin路径列表

找到问题的解决方案?怎么办?
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
                .antMatchers("/resources/**", "/webjars/**", "/VAADIN/**", "/PUSH/**", "/UIDL/**", "/vaadinServlet/UIDL/**","/vaadinServlet/HEARTBEAT/**", "/registration").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    http.csrf().ignoringAntMatchers("/home**", "/VAADIN/**", "/PUSH/**", "/UIDL/**", "/vaadinServlet/UIDL/**","/vaadinServlet/HEARTBEAT/**");
}