spring-security 一种用香草和百里香叶组合的 Spring 安全剂

eanckbw9  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(167)

在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();
    }
}
8iwquhpp

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来隔离您的问题,以便社区可以更有效地提供帮助。

相关问题