我在@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
我希望任何人都可以访问
RecipeBrowserView
和LoginView
,但是只有登录用户才能访问RecipeManagerView
和IngredientMangerView
。 最佳答案
您不能将Spring Security的基于路径的匹配用于Vaadin路由。 Spring Security根据请求路径进行匹配,而在Vaadin中从一个视图导航到另一个视图的导航将作为内部请求中的元数据发送,该内部请求始终转到相同的硬编码路径。
相反,您可以在Vaadin提供的拦截器中实现访问控制逻辑。您可以查看https://vaadin.com/tutorials/securing-your-app-with-spring-security以获得更多有关此的信息。