Spring Boot Actuator端点默认受基本http安全保护。
可以更改为使用Spring Security吗? 我已成功设置Spring Security并使用它来保护我的其他页面。
我尝试了security.basic.enabled: false
并在我的授权请求中添加了.antMatchers("/manage/**").hasRole("ADMIN")
(请注意,我使用的是另一个URL作为端点的端点),但这没有用。
我一直在获得一个基本的http auth日志,它不是在AuthenticationManager中配置的用户。
有什么想法吗?
编辑 - 提供更多详情 -
我的Application.java看起来像:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends WebMvcConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/app").setViewName("app/index");
registry.addViewController("/app/login").setViewName("app/login");
}
@Bean
public ApplicationSecurity applicationSecurity() {
return new ApplicationSecurity();
}
@Order(Ordered.LOWEST_PRECEDENCE - 8)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off
auth.inMemoryAuthentication()
.withUser("test1")
.password("test1pw")
.roles("USER", "ADMIN")
.and()
.withUser("test2")
.password("test2pw")
.roles("USER");
// @formatter:on
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/app/login").permitAll()
.antMatchers("/app/**").hasRole("USER")
.antMatchers("/manage/**").hasRole("ADMIN")
.and()
.formLogin()
.loginPage("/app/login")
.failureUrl("/app/login?error")
.defaultSuccessUrl("/app")
.permitAll()
.and()
.logout()
.logoutUrl("/app/logout")
.logoutSuccessUrl("/app/login?logout");
// @formatter:on
}
@Override
public void configure(WebSecurity web) throws Exception {
// @formatter:off
web
.ignoring()
.antMatchers("/assets/**");
// @formatter:on
}
}
}
在我application.yml
我也有:
management:
context-path: /management
请注意,设置与您提到的指南相同。
现在我期望 - 或者喜欢配置 - 是健康,映射等/ manage端点将受到来自自定义AuthenticationManager的用户的保护。
我还尝试添加management.security.enabled=false
,这确实会关闭身份验证,例如/管理/映射。
然而,问题是我明确告诉Spring Security通过以下方式保护这些网址:
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/app/login").permitAll()
.antMatchers("/app/**").hasRole("USER")
.antMatchers("/manage/**").hasRole("ADMIN")
但这不起作用。注意其他授权匹配器确实有效。
我想知道在时间/顺序中是否有事可做。我从样本中复制了@Order(Ordered.LOWEST_PRECEDENCE - 8)
,但我不知道为什么 - 使用了8。
为了深入研究,我自己也运行了样本(https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web-method-security),我在示例应用程序中看到了相同的行为。
管理安全性似乎完全独立于内存身份验证中样本中配置的user
和admin
用户。
答案 0 :(得分:3)
可以更改为使用Spring Security吗?
是 Spring Security(您认为我们还使用了什么?)。如果您只想保留默认安全规则并自定义AuthenticationManager
,那么如果您按照Spring Security团队的建议使用AuthenticationManagerBuilder
,它应该可以正常工作。 secure method sample具有您要查找的行为,因此您可以从那里复制配置模式。如果要替换引导默认身份验证策略,关键是要在AuthenticationManager
like in the sample中配置GlobalAuthenticationConfigurerAdapter
。
您可以使用management.security.enabled=false
关闭管理安全性(假设Spring Security位于类路径上)。 user guide中提到了它,但可以随意提出澄清。
答案 1 :(得分:1)
我想说,如果您有非常具体的情况,有时候排除Spring Boot组件的自动配置并从头开始进行配置会更容易。在这种情况下,您可以使用:
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})
如果您想保留其余的Boot Security配置,则只需ManagementWebSecurityConfiguration.java
。然后你可以使用类似的东西:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration {
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {
private final SecurityProperties securityProperties;
@Autowired
AuthenticationSecurity(SecurityProperties securityProperties) {
this.securityProperties = securityProperties;
}
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
// configuration
}
}
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
private SecurityProperties security;
@Autowired
protected ApplicationSecurity(SecurityProperties security) {
this.security = security;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// you configuration
}
}
}
正如您所看到的,我在这种情况下重用了SecurityProperties,以避免自己创建。