java Sping Boot 中的多个身份验证(并行使用Vaadin和REST API)

gzjq41n4  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(110)

我想运行Vaadin 23前端,但我的应用程序中也有一个REST API。我想使用基于令牌(JWT)的身份验证REST API和基于标准表单的前端。我已经测试了许多不同的配置,从例子在Spring Security文档和互联网上。唯一的配置,其中两个选项都得到调用初始化是这样一个:

@EnableWebSecurity
public class SecurityConfiguration extends VaadinWebSecurity {

    // ... other stuff here ...

    @Bean
    @Order(1)
    public SecurityFilterChain restFilterChain(HttpSecurity http) throws Exception {
        return http
                .cors().and().csrf().disable()
                .authorizeRequests().antMatchers("/api/login").anonymous().and()
                .authorizeRequests().antMatchers("/api/**").authenticated().and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .addFilterBefore(authTokenFilter(), UsernamePasswordAuthenticationFilter.class)
                .build();
    }

    @Bean
    @Order(2)
    public SecurityFilterChain frontendFilterChain(HttpSecurity http) throws Exception {
        super.configure(http);
        setLoginView(http, LoginView.class, LOGOUT_URL);

        return http.build();
    }
}

这两个配置块都可以工作,我尝试了两个配置块,一个是@Order(1),另一个是@Order(2)。在登录时调用获取@Order(1)的配置,验证工作正常。但是无论另一个尝试如何结束(使用.denyAll()或仅使用“nothing”),都没有回退到@Order(2)。我错过了什么?
Spring 版:5.3.22
Spring安全版本:5.7.3

njthzxwz

njthzxwz1#

对我来说,这工作得很好。代码在Kotlin上,但配置代码与java相同。

override fun configure(http: HttpSecurity) {
//        http.authorizeRequests().
//        anonymousPostLeads(http)
        http
            .authorizeRequests().antMatchers("/api/login").anonymous().and()
            .authorizeRequests().antMatchers("/api/**").authenticated().and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
            .addFilterBefore(authTokenFilter(), UsernamePasswordAuthenticationFilter::class.java)

        // Authorize access to /images/ without authentication
        http.authorizeRequests().antMatchers("/images/**").permitAll()
        super.configure(http)
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
        setLoginView(http, LoginView::class.java, "/logout")

        http.cors().and().csrf().ignoringAntMatchers("/api/login", "/api/**")
    }

相关问题