用于Vaadin的Spring安全Java配置

我是这些框架的新手(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类:

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

哪个.antMatchers()应该定义我是否想阻止应用程序的每个请求,如果用户没有登录? 我知道我必须为登录页面定义antMatchers(“/ resources / **”)。permitAll()以获取css和图像。 但是这些模式像“/ UIDL / **”是什么,我需要它们什么?


哪个.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,图像)和VAADIN来说,你可以重写另一种方法:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
        .antMatchers("/resources/**", "/VAADIN/**");
}

有了Spring Boot项目,如果我不允许在web.ignoring().antMatchers(...)请求"/vaadinServlet/**" ,我还会发现问题。

这些模式像“/ UIDL / **”是什么,我需要它们什么?

当服务器收到请求时,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视图和用户界面,我不确定是否可以使用antMatchers来授予或拒绝访问,但是您可以使用@EnableGlobalMethodSecurity(prePost = enabled)注释配置类,然后可以使用@PreAuthorize( /* spel expression */)批注在视图授予或拒绝访问。

更新 :回答评论问题:

  • 为什么使用configure(WebSecurity web)方法忽略资源而不是配置(HttpSecurity http)允许访问? 有重大差异吗?
  • 区别在于WebSecurity#ignoring()使得该请求从Spring Security过滤器链中跳过,并且它是静态资源的推荐方式,但应该在configure(HttpSecurity http)内处理静态资源以外的其他任何内容。

    资源

  • 为什么你忽略“/ VAADIN / **”路径?
  • 由于该路径用于提供主题,窗口小部件集和自定义内容(静态内容),因此该路径用于从Vaadin jar中进行dinamycally服务,但正如Vaadin文档中所述,生产环境中应该静态地提供服务它更快。

    资源

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

    用户界面定义语言(UIDL)是一种用于序列化用户界面内容以及从Web服务器到浏览器的响应变化的语言。 这个想法是,服务器端组件使用语言将自己“绘制”到屏幕(网页)上。 UIDL消息在浏览器中解析并转换为GWT小部件。

    资源

    心跳请求定期执行,以验证服务器和客户端之间的连接是否仍然存在,或者该会话尚未到期。

    来源 - 见4.8.5,4.8.6,4.8.7和4.8.8节

    链接地址: http://www.djcxy.com/p/89871.html

    上一篇: Java Config for Spring Security with Vaadin

    下一篇: Pygtk color for drag