我有一个基于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年前的问题,但我的问题没有接受答案:
答案 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();