我正在尝试使用Sping Boot 安全性实现控制器身份验证。
当定制我的filterChain
时,我得到401未经授权的资源,我已经特别允许。
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeHttpRequests()
.requestMatchers("/api/auth/**").permitAll()
.requestMatchers("/api/test/**").permitAll()
.requestMatchers(h2ConsolePath + "/**").permitAll()
.anyRequest().authenticated();
http
.headers()
.frameOptions().sameOrigin();
http
.authenticationProvider(authenticationProvider());
http
.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
例如,我想访问我的h2-console,但我不想在访问h2-console时进行任何身份验证,但我仍然收到一条错误消息,状态代码为403 Forbidden。
甚至当我删除.anyRequest().authenticated();
这一行时,我也会得到同样的错误,这让我认为整个过滤器链可能没有得到应用?但是当我调试它并在方法内部设置断点时,程序会跳到方法内部,所以它应该得到应用?经过许多小时的研究,我不确定如何继续。
编辑:
我还添加了一个TestController
,它带有TestResource
,但没有@PreAuthorize
注解,当我在Postman中测试它时,我得到了以下错误消息:
访问此资源需要完全身份验证
正如已经提到的,我有一种感觉,过滤器链没有应用,因为即使当我删除.anyRequest().authenticated
相同的错误仍然发生,所以它对我来说没有意义。
1条答案
按热度按时间0s0u357o1#
所以经过几个小时的痛苦和折磨,我终于找到了解决办法。我回到Java 1. 8版,使用
antMatchers
而不是requestMatchers
。这是我最后的代码