在Vaadin视图中忽略Spring安全注解;我在类级别上有一个@DenyAll,但视图仍然被呈现。
这个项目在spring Boot 中结合了thymeleaf和vaadin。前者用于在WebSocket上快速渲染带有命令和事件的大型HTML,后者用于简化管理屏幕的开发。Vaadin设置在“/vdn/"下,spring MVC和thymeleaf设置在“/"下。
Spring的安全工作正确地在thymeleaf; login、logout和sec:authorize正确地隐藏或显示了生成的HTML的一部分。但是Vaadin视图上的安全标记被忽略了。
@Route("/")
@StyleSheet("context://../vaadin.css")
@DenyAll
public class MainView extends AppLayout {
根据文档(https://vaadin.com/docs/latest/security/enabling-security),如果没有注解,视图就不应该显示,但是它确实显示了。所以不知何故Vaadin没有获得Spring安全性。有什么建议吗?
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Autowired
private DataSource dataSource;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().passwordEncoder(new BCryptPasswordEncoder()) //
.dataSource(dataSource) //
.usersByUsernameQuery("select username, password, enabled from person where username=?") //
.authoritiesByUsernameQuery("select username, role from person where username=?") //
;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests() //
.anyRequest().authenticated() //
.and() //
.formLogin() //
.and() //
.csrf().disable() // needed for vaadin https://tutorialmeta.com/question/server-connection-lost-after-successful-login-with-spring-security
.logout()
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
;
return http.build();
}
}
1条答案
按热度按时间8iwquhpp1#
正如在注解中提到的,为了使Vaadin基于视图的安全性工作,应该首先通过扩展您的安全配置类从
VaadinWebSecurity
(对于V23.2+)或VaadinWebSecurityConfigurerAdapter
(旧版本)来启用它。您可以参考这里的文档:https://vaadin.com/docs/latest/security/enabling-security/#security-configuration-class当从上述任何一个类扩展时,如果你覆盖
void configure(HttpSecurity http) throws Exception
方法(几乎总是需要的),不要忘记按照文档中提到的正确顺序调用super.configure(http);
。这一点很重要,因为viewAccessChecker
bean是通过这个调用启用的,这也是你需要让基于视图的安全性工作的原因。注意:您可能在许多教程和文档中看到过
http.authorizeRequests()
(ExpressionInterceptUrlRegistry
类型)上的调用链。一旦.anyRequest().PermitAll()
或一些类似的方法被调用,它就不再接受这些模式匹配配置的任何配置,所以在调用super.configure(http);
之前配置您的自定义模式匹配配置是很重要的(如所提到的文档中所示)。最后,设置登录表单(在文档中通过调用
setLoginView(http, LoginView.class);
完成)是一个重要的步骤,因为它不仅将您的自定义登录视图引入viewAccessChecker
bean,而且还启用Spring Security的基于表单的登录特性,该特性是基于视图的安全机制正常工作所必需的。如果您已按顺序完成上述所有步骤,则会考虑
@DenyAll
或@RolesAllowed
等访问注解,并且您可以预期它们会按文档中的说明工作。如果您在启用它时仍有问题,请提供一个Minimal, Reproducible Example来隔离您的问题,以便社区可以更有效地提供帮助。