一尘不染

配置执行器端点安全性

spring-boot

默认情况下,Spring Boot Actuator端点受基本http安全性保护。

可以更改为使用Spring Security吗?我已经成功设置了Spring Security,并用它来保护我的其他页面。

我尝试security.basic.enabled: false添加.antMatchers("/manage/**").hasRole("ADMIN")授权请求(请注意,我使用不同的URL作为端点的根),但这无济于事。我一直在获取基本的HTTP身份验证日志,该用户不在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,这确实关闭了/ manage /
mappings的身份验证。但是有问题的是,我明确地告诉Spring Security通过以下方式保护这些URL:

@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-
安全性)我和我看到示例应用程序相同的行为。管理安全性似乎是完全独立的useradmin用户在内存认证样品的配置。


阅读 242

收藏
2020-05-30

共1个答案

一尘不染

可以更改为使用Spring Security吗?


spring安全(还有什么你认为我们会使用?)。如果您只想保留默认的安全规则并对其进行自定义,AuthenticationManager那么如果您使用AuthenticationManagerBuilderSpring
Security团队推荐的,它应该可以正常工作。该安全的方法示例有你要找的行为,所以你可以在配置模式从那里复制。如果要替换Boot默认的身份验证策略,关键是要以sampleAuthenticationManager中的GlobalAuthenticationConfigurerAdapter
like方式进行配置。

您可以使用来关闭管理安全性management.security.enabled=false(假设Spring
Security在类路径中)。用户指南中提到了此问题,但请随时提出说明。

2020-05-30