Spring启动器执行器安全服务不能正常工作

时间:2015-03-06 00:01:31

标签: spring spring-mvc spring-boot

我试图在调用时确保弹簧执行器服务/管理上下文路径:

http://localhost:9091/manage/metrics

在我的yalm.properties中使用此配置

management: port: 9091 address: 127.0.0.1 context-path: /manage security: enabled: true role: ADMIN

Git branch with security actuator service layer

但访问每项服务仍然是免费的。

Spring安全配置:

' @覆盖     protected void configure(HttpSecurity http)抛出异常{

    http.authorizeRequests().antMatchers("/pizzas","/info","/addPizza").hasAnyRole("USER","ADMIN").and().authorizeRequests().antMatchers("/users","/addUser").hasRole("ADMIN").and().authorizeRequests().antMatchers("/static/**","/logout","/login").permitAll();

    http.formLogin().loginPage("/login").failureUrl("/login?error").permitAll();

    http.logout().logoutSuccessUrl("/?logout").deleteCookies("remember-me").permitAll();


    http.sessionManagement().maximumSessions(1).
    expiredUrl("/?expired").maxSessionsPreventsLogin(true).and()
    .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
}

/**
 * Configure global security with Bccyptenoncder and custom userDetailService with Spring Security
 * @param auth
 * @throws Exception
 */
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

    auth.userDetailsService(userDetailsServiceImpl).passwordEncoder(passwordEncoder());
}


/**
 * Bcrypt password encoding configuration, more info at http://www.baeldung.com/spring-security-registration-password-encoding-bcrypt
 * @return
 */
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
'

1 个答案:

答案 0 :(得分:1)

Spring boot团队已经解决了我这个问题。我在这里分享解决方案:

同源政策

您不能在执行器安全性中使用主Spring应用程序的登录页面。原因是cookie将与应用程序的域+端口+上下文路径相关联。这是同源政策的一部分

这意味着如果您将用户发送到localhost:9090 / pizza / login并进行身份验证,那么当您访问localhost时:9091 / manage / JSESSIONID cookie将不会提交给管理应用程序,这意味着您不会被视为已通过身份验证

为了跨域进行身份验证(在这种情况下是不同的端口),您需要一些单点登录(OpenID,CAS,SAML等)机制。

在管理应用程序中映射登录页面

要使用此配置,您需要在管理应用程序中设置登录页面。要执行此操作,您只需在请求/ login时返回HTML表单。但是,我并不确定如何在Boot管理应用程序中执行此操作。也许@philwebb或@dsyer可以详细说明如何做到这一点。

管理应用程序的独特安全配置

或者,您可以为管理应用程序创建单独的安全配置,以允许使用基本身份验证进行身份验证。为此,您将创建另一个类似于以下内容的安全配置:

@Order(0)
@Configuration
public class ManagementSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
         http
            .requestMatchers()
                .requestMatchers(request -> "/manage".equals(request.getContextPath()))
                .and()
            .authorizeRequests()
                .anyRequest().hasRole("ADMIN")
                .and()
            .httpBasic();
    }
}

这将确保如果上下文根是" / manage"使用此安全配置。一些兴趣点:

@Order(0)确保配置发生在其他安全配置之前,因为默认情况下,WebSecurityConfigurerAdapter的任何子类都将在100处排序。这很重要,因为只使用了第一个WebSecurityConfigurerAdapter(类似于authorizeRequests()匹配器) 。 请求匹配器使用lambda在contextPath上进行匹配。我原以为有一种更好的方法可以区分Spring Boot应用程序和主应用程序,但事实并非如此。也许@dsyer知道应该怎么做。 注

您可以更简洁地重写配置:

 http
    .authorizeRequests()
        .antMatchers("/pizzas","/info","/addPizza").hasAnyRole("USER","ADMIN")
        .antMatchers("/users","/addUser").hasRole("ADMIN")
        .antMatchers("/static/**","/logout","/login").permitAll()
        .and()
    .formLogin()
        .loginPage("/login")
        .failureUrl("/login?error")
        .permitAll()
        .and()
    .logout()
        .logoutSuccessUrl("/?logout")
        .deleteCookies("remember-me")
        .permitAll();

您可以考虑阅读Spring Security Java Config Preview:Readability,了解有关如何格式化配置以便更好地阅读它的详细信息。