Spring Boot with Spring Boot:在使用过滤器时允许在特定端点上进行未经身份验证的用户访问

时间:2016-12-02 08:28:45

标签: spring rest authentication spring-security spring-boot

我在这里挣扎着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拒绝访问

为什么在我提到允许所有人而不仅仅是为这些终点进行身份验证时,是否需要身份验证令牌?我该如何正确实施呢?

3 个答案:

答案 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()的。反之亦然。