Spring-Boot REST服务基本http auth排除一个端点

时间:2017-07-28 13:34:37

标签: java rest spring-boot

我有一个基于REST的微服务构建在Spring-Boot版本1.5.4.RELEASE上,带有spring-boot-starter-security。该服务没有网页,只有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身份验证中排除一个小路径,一个小端点。从疯狂的谷歌搜索和SO拷贝粘贴我修改了以上内容:

    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?

3 个答案:

答案 0 :(得分:3)

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

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

一个重要的警告:当我发布这个时,我正在通过使用BOGUS http凭证调用curl来测试healthcheck端点,期望Spring忽略它们,但是Spring总是回答401-unauthorized。正确的测试是使用NO http凭据调用curl,然后healthcheck端点非常愉快地回答。

答案 1 :(得分:1)

我已经在Springboot服务的SecurityConfig中添加了以下内容,并且工作正常,我能够从基本身份验证中排除某些终结点。

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

答案 2 :(得分:0)

你说你的链接如下:

localhost:8081/abcd/healthcheck

试试这个:

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