我在这里挣扎着Spring Security的基础知识。
我希望实现的目标
我的系统仅用于REST API处理,/user/sign_in
上有一个登录端点POST和一些开放端点 - /prompt/, /prompt/{id}, /story/, /story/{id}
上的GET,其余一切仅供经过身份验证的用户使用。
我有一个自定义身份验证过滤器,我已经放在BasicAuthenticationFilter
之前。我在这里分享我的WebSecurityConfigurerAdapter代码
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DemoAuthenticationProvider demoAuthenticationProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/version", "/story", "/prompt").permitAll()
.antMatchers(HttpMethod.POST, "/user/sign_in").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(new DemoAuthenticationFilter(), BasicAuthenticationFilter.class);
http.csrf().disable();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(demoAuthenticationProvider);
}
}
对于开放端点的匿名用户,我在过滤器中返回了一个空身份验证令牌并且我正在
403拒绝访问
为什么在我提到允许所有人而不仅仅是为这些终点进行身份验证时,是否需要身份验证令牌?我该如何正确实施呢?
答案 0 :(得分:2)
我的坏!
spring-boot的结束点=控制器的请求映射+方法的请求映射。我提到的GET映射在/
。在改为
.antMatchers(HttpMethod.GET, "/version/", "/story/", "/prompt/").permitAll()
.antMatchers(HttpMethod.POST, "/user/sign_in/").permitAll()
事情正在发生。
答案 1 :(得分:2)
这适合我的:
.and().authorizeRequests().antMatchers("/URL1/**", "/URL2/**").anonymous().anyRequest().authenticated();
答案 2 :(得分:0)
对我来说,它与
.antMatchers(HttpMethod.GET, "/api/specific/**").permitAll()
.antMatchers("/api/**").authenticated()
在这种情况下,请注意,特定端点是在需要验证的通用端点之前设置了allowAll()的。反之亦然。