Spring-Boot REST 服务基本 http 身份验证排除一个端点

Posted

技术标签:

【中文标题】Spring-Boot REST 服务基本 http 身份验证排除一个端点【英文标题】:Spring-Boot REST service basic http auth exclude one endpoint 【发布时间】:2018-01-04 14:35:25 【问题描述】:

我有一个基于 Spring-Boot 版本 1.5.4.RELEASE 和 spring-boot-starter-security 构建的纯 REST 微服务。该服务没有网页,只有 JSON 输入和输出。用户名和密码在 application.properties 文件中配置。归功于http://ryanjbaxter.com/2015/01/06/securing-rest-apis-with-spring-boot/,以下配置使服务器很好地实现了基本的HTTP身份验证,它接受凭据并拒绝未经授权的请求:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable().authorizeRequests() //
                .anyRequest().authenticated().and().httpBasic();        
    

我的问题是,我想从基本 HTTP 身份验证中排除一个小 ole 路径、一个小端点。从疯狂的谷歌搜索和复制粘贴中,我修改了上面的内容:

    http.csrf().disable().authorizeRequests() //
        .antMatchers("/healthcheck").permitAll()
        .anyRequest().authenticated().and().httpBasic();

这会编译并运行而不会发出警告,但不会打开该路径以进行未经身份验证的访问。我仍然必须提供凭据来检查服务运行状况。

我必须一一匹配路径吗?我的小型运行状况检查端点位于上下文路径的基础上,一大堆其他端点也是如此 - 一个接一个地添加路径会很麻烦。

我的 application.properties 文件的相关部分是:

security.user.name = web-user
security.user.password = web-pass
management.security.roles=SUPERUSER

也许我需要以某种方式摆弄角色?

请帮忙,提前谢谢。

更新 1:

路径信息 - 我希望保护这条路径(以及更多根路径):

localhost:8081/abcd/user

我只想打开这条路径,不需要身份验证:

localhost:8081/abcd/healthcheck

更新 2:看起来我在很大程度上重复了这个 3 年前的问题,但那里没有接受我的问题的答案:

spring-boot setup basic auth on a single web app path?

【问题讨论】:

您能否发布产生问题的完整 url 请求? 看这里:***.com/questions/24696717/… /healhtcheck 不是 /abcd/healthcheck 【参考方案1】:

我在 Springboot 服务的 SecurityConfig 中添加了以下内容,它工作正常,我能够从基本身份验证中排除一些端点。

@Override
    public void configure(WebSecurity web) throws Exception 
        web.ignoring().antMatchers("/customers/**/hints", "/customers/**/search", "/customers/**/clientConfig");
    

【讨论】:

这段代码 sn-p 没有显示对方法 authorizeRequests() 的调用。在您的服务中,是否有任何端点需要授权? 我确实在所有端点上配置了基本身份验证,并通过以下代码大摇大摆 @Override protected void configure(HttpSecurity http) throws Exception http.csrf().disable(); http.httpBasic() // 表示需要基本认证 .and() .authorizeRequests() .antMatchers("/swagger-ui.html**").permitAll() .antMatchers("/**").authenticated (); 【参考方案2】:

经过更多实验后,我发现以下工作 - @efekctive 请注意,健康检查上没有上下文前缀:

@Override
protected void configure(HttpSecurity http) throws Exception 
    http.csrf().disable().authorizeRequests()
     .antMatchers("/healthcheck").permitAll()
     .antMatchers("/**").authenticated().and().httpBasic();

一个重要警告:当我发布此消息时,我正在通过使用 BOGUS http 凭据调用 curl 来测试运行状况检查端点,期望 Spring 忽略它们,但 Spring 总是回答 401-unauthorized。正确的测试是调用 curl 时根本没有 http 凭据,然后运行状况检查端点会非常高兴地回答。

【讨论】:

试过这个,对我不起作用。仅供参考,我使用的是 sessionCreationPolicy 而不是 httpBasic【参考方案3】:

你说你的链接看起来像:

localhost:8081/abcd/healthcheck

试试这个:

http.csrf().disable().authorizeRequests() //
    .antMatchers("/abcd/healthcheck").permitAll()
    .anyRequest().authenticated().and().httpBasic();

【讨论】:

感谢@JavaBoy 非常快速的回复,但还没有高兴。我使用了该代码,通过在不提供任何凭据的情况下使用 curl 请求该端点进行测试;响应是 401 未授权。 您是否尝试过在课堂上使用@EnableWebSecurity? github.com/spring-projects/spring-boot/issues/8646 无论 WebSecurityConfigurerAdapter 类上是否存在 @EnableWebSecurity 注释,我都会看到相同的行为。 查看本页底部:docs.spring.io/spring-boot/docs/current/reference/html/…

以上是关于Spring-Boot REST 服务基本 http 身份验证排除一个端点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring-boot 中不模拟服务类的情况下为 REST 控制器端点编写单元测试

列出所有已部署的 REST 端点(spring-boot、jersey)

列出所有已部署的 REST 端点(spring-boot、tomcat)

在 CORS 期间 Spring-Boot RestController 失败

在 CORS 期间 Spring-Boot RestController 失败

Spring-boot REST 安全配置角色无法正常工作