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

Posted

技术标签:

【中文标题】Spring Security with Spring Boot:使用过滤器时允许未经身份验证的用户访问特定端点【英文标题】:Spring Security with Spring Boot: Allowing unauthenticated user access on specific endpoints when using a filter 【发布时间】:2017-04-17 02:24:01 【问题描述】:

我正在努力学习 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 访问被拒绝

当我提到允许所有而不是仅对这些端点进行身份验证时,为什么需要身份验证令牌?以及如何正确实施它?

【问题讨论】:

【参考方案1】:

我的错!

spring-boot的端点=控制器的请求映射+方法的请求映射。我提到的 GET 映射在 /。更改为

.antMatchers(HttpMethod.GET, "/version/", "/story/", "/prompt/").permitAll()
                .antMatchers(HttpMethod.POST, "/user/sign_in/").permitAll()

事情正在发生。

【讨论】:

【参考方案2】:

这对我有用:

 .and().authorizeRequests().antMatchers("/URL1/**", "/URL2/**").anonymous().anyRequest().authenticated();

【讨论】:

【参考方案3】:

对我来说,它适用于

.antMatchers(HttpMethod.GET, "/api/specific/**").permitAll()
.antMatchers("/api/**").authenticated()

请注意,在这种情况下,特定端点是在需要身份验证的通用端点之前使用 permitAll() 设置的。反过来就不行了。

【讨论】:

以上是关于Spring Security with Spring Boot:使用过滤器时允许未经身份验证的用户访问特定端点的主要内容,如果未能解决你的问题,请参考以下文章

REST Security with JWT using Java and Spring Security

Spring Security with Hibernate,存储加密密码

Understand Spring Security Architecture and implement Spring Boot Security

spring 3.1 with hibernate 4 with spring security 3.1:如何确保包含所有依赖项以及要包含哪些标签?

Spring Boot & Security with AngularJS 登录页面

Spring Data Rest with Spring Security - 按当前用户查找所有内容