我在@Vaadin中通过@Route取得的视图很少,现在我想添加安全性和一些登录名。在我的SecurityConfiguration类中,我只为2个视图设置antMatchers.permitAll(),其余的都设置为Role ADMIN。但是它没有按我认为的那样工作。它要求登录才能访问每个视图,登录后无论用户具有什么角色,我都可以访问所有视图。

我希望本教程对我有帮助,但是如果没有登录,就无法访​​问任何视图。

Securing Your App With Spring Security

我的配置类:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private UserService userService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    public SecurityConfiguration(UserService userService) {
        this.userService = userService;
    }

    @Autowired
    private void configureAuth(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
        auth.inMemoryAuthentication()
                .withUser("user")
                .password(passwordEncoder().encode("user"))
                .roles("USER");
    }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
      http.httpBasic().and()
              .anonymous()
              .and()
              .authorizeRequests()
              .antMatchers("/", "/login").permitAll()
              .antMatchers("/recipe-manager", "/ingredient-manager").hasAnyRole("ADMIN")
              .and()
              .formLogin().loginPage("/login").permitAll()
              .and()
              .logout().logoutSuccessUrl("/")
              .and()
              .csrf().disable().cors().disable().headers().disable();
  }
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(
                "/VAADIN/**",
                "/favicon.ico",
                "/robots.txt",
                "/manifest.webmanifest",
                "/sw.js",
                "/offline-page.html",
                "/icons/**",
                "/images/**",
                "/frontend/**",
                "/webjars/**",
                "/h2-console/**",
                "/frontend-es5/**", "/frontend-es6/**");
    }
}


我的视图具有如下注释:

@Route("recipe-manager")
public class RecipeManagerView extends VerticalLayout
@Route("")
public class RecipeBrowserView extends VerticalLayout
@Route("login")
public class LoginView extends VerticalLayout
@Route("ingredient-manager")
public class IngredientManagerView extends VerticalLayout


我希望任何人都可以访问RecipeBrowserViewLoginView,但是只有登录用户才能访问RecipeManagerViewIngredientMangerView

最佳答案

您不能将Spring Security的基于路径的匹配用于Vaadin路由。 Spring Security根据请求路径进行匹配,而在Vaadin中从一个视图导航到另一个视图的导航将作为内部请求中的元数据发送,该内部请求始终转到相同的硬编码路径。

相反,您可以在Vaadin提供的拦截器中实现访问控制逻辑。您可以查看https://vaadin.com/tutorials/securing-your-app-with-spring-security以获得更多有关此的信息。

10-05 21:15
查看更多