我将已经存在的应用程序从Spring Boot 1.3更新到2.0.1。该应用程序使用Actuator并公开REST风格的API。
在Boot 1.3中,无需身份验证即可使用API,并且执行器端点配置为受密码保护:
security.user.name=foo
security.user.password=bar
security-user.role=ADMIN
我更新了此内容,如configuration changelog中所述,并将条目从security.user.name
重命名为spring.security.user.name
等。
但是当我尝试curl
我的API时,我被拒绝了,因为我没有提供凭据:
在Spring Blog中,我找到了一个可能的解决方案,如何在详细级别配置Spring Security:
http
.authorizeRequests()
// 1
.requestMatchers(EndpointRequest.to("status", "info"))
.permitAll()
// 2
.requestMatchers(EndpointRequest.toAnyEndpoint())
.hasRole("ACTUATOR")
// 3
.requestMatchers(StaticResourceRequest.toCommonLocations())
.permitAll()
// 4
.antMatchers("/**")
.hasRole("USER")
.and()
...
但这比我需要的更精细,我正在寻找基于application.properties
的解决方案。
有没有办法在没有额外代码的情况下解决这个问题?
答案 0 :(得分:5)
当您设置spring.security.user.name
和spring.security.user.password
时,您将通过spring-security
为整个应用程序配置表单登录,包括Actuator端点。
不幸的是,在Spring Boot 2.0中,您无法使用属性设置不同的用户名/密码或禁用Actuator端点的身份验证。这意味着您必须通过安全配置明确允许执行器端点。
通过spring-security
,您还可以允许公共访问您的终端,并且非常容易要求执行器端点的凭据:
@Configuration
public class BasicSecurityConfig extends WebSecurityConfigurerAdapter {
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/actuator/**").hasRole("ACTUATOR")
.anyRequest().permitAll();
}
}
(我假设您使用的是WebMvc,而不是WebFlux,这有点不同)
确认application.properties
中有以下内容:
spring.security.user.name=user
spring.security.user.password=pass
spring.security.user.roles=ACTUATOR,USER # and others, if you like
management.endpoint.health.roles=ACTUATOR
请参阅here,了解Spring 1.x与2.0中Actuator的差异之间的快速而精彩的解释。
答案 1 :(得分:2)
对于 Spring Boot 2.0,当我们覆盖 configure
的 WebSecurityConfigurerAdapter
方法时,所有现有安全性都会退避,我们可以提供自定义安全性。在您的情况下,您只需要对执行器端点进行身份验证,可以按如下方式完成:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/actuator/**").authenticated();
}
}
无需更改 application.properties
文件。