Spring Boot Management 安全性与端口集的工作方式不同
Posted
技术标签:
【中文标题】Spring Boot Management 安全性与端口集的工作方式不同【英文标题】:Spring Boot Management security works differently with port set 【发布时间】:2015-07-09 11:56:52 【问题描述】:我正在尝试配置具有执行器支持的 Spring Boot 应用程序(1.2.3,但对于 1.2.4.BUILD-SNAPSHOT 版本也失败)。我想使用 Actuator 安全配置来控制对管理端点的访问,以及我们自己对应用程序其余部分的身份验证。
这是我的安全配置:
@Configuration
@EnableWebSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter
@Autowired
private CustomAuthenticationProvider customAuthProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(customAuthProvider);
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.regexMatchers(API_DOC_REGEX).permitAll()
.regexMatchers(String.format(PATH_REGEX, PUBLIC_ACCESS)).permitAll()
.regexMatchers(String.format(PATH_REGEX, INTERNAL_ACCESS)).access("isAuthenticated() && authentication.hasOrigin('INTERNAL')")
.regexMatchers(String.format(PATH_REGEX, EXTERNAL_AUTHENTICATED_ACCESS)).authenticated()
.antMatchers("/**").denyAll()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.addFilterAfter(customAuthProcessingFilter(), BasicAuthenticationFilter.class)
.csrf().disable();
当我没有设置管理端口时,这可以正常工作,但是当我设置管理端口时,管理 URL 会返回 401 响应。如果我注释掉.antMatchers("/**").denyAll()
行,那么一切都不需要身份验证即可完成。因此,当我设置自定义端口时,它看起来像是在为执行器端点使用我的应用程序的安全配置,但我不确定为什么。
如何让它在自定义端口上运行时使用它自己的安全性?
【问题讨论】:
添加另一个具有@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)
的WebSecurityConfigurerAdapter
,如here 中所述
看起来这就是我在做什么?文档说The Actuator security features can be modified using external properties (management.security.*). To override the application access rules add a @Bean of type WebSecurityConfigurerAdapter and use @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) if you don’t want to override the actuator access rules, or @Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER) if you do want to override the actuator access rules.
不,你配置的是通用应用规则而不是管理规则。
【参考方案1】:
扩展来自@M. Deinum 的评论,为管理的东西添加另一个适配器(即使它已经有一个)似乎已经修复了它。这是我结束的课程:
@Order(0)
@Configuration
public class ManagementSecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
ManagementServerProperties managementProperties;
@Override
protected void configure(HttpSecurity http) throws Exception
http
.requestMatchers()
.requestMatchers(new RequestMatcher()
@Override
public boolean matches(HttpServletRequest request)
return managementProperties.getContextPath().equals(request.getContextPath());
)
.and()
.authorizeRequests()
.anyRequest().hasRole("ADMIN")
.and()
.httpBasic();
【讨论】:
以上是关于Spring Boot Management 安全性与端口集的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章
在 tomcat 容器中具有多个 Web 应用程序的 Spring Boot 执行器引发 javax.management.InstanceAlreadyExistsException 异常
Spring Boot 2 Actuator 端点在 GET 请求上返回 405