View on GitHub

spring-boot-in-action

Spring Boot 实战笔记

保护 Actuator 端点

很多Actuator端点发布的信息都可能涉及敏感数据,还有一些端点,(比如/shutdown)非常危 险,可以用来关闭应用程序。

因此,保护这些端点尤为重要,能访问它们的只能是那些经过授权 的客户端。

Actuator的端点保护可以用和其他URL路径一样的方式——使用Spring Security。

在 Spring Boot应用程序中,这意味着将Security起步依赖作为构建依赖加入,然后让安全相关的自动配置来保护应用程序,其中当然也包括了Actuator端点。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

端点用户权限

想要保护/shutdown端点,仅允许拥有ADMIN权限的用户访问:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        // “/”的请求只有经过身份认证且拥有READER角色的用户才能访问
        .antMatchers("/").hasAnyRole("READER","ADMIN") 
        // 要求有ADMIN权限
        .antMatchers("/shutdown").access("hasRole('ADMIN')")      
        // 设置登录表单的路径
        .antMatchers("/**").permitAll().and().formLogin().loginPage("/login") 
        .failureUrl("/login?error=true");
}

URL 访问权限控制示例:

	 //http.authorizeRequests()方法有多个子节点,每个macher按照他们的声明顺序执行     
http.authorizeRequests()      
	 //我们指定任何用户都可以访问多个URL的模式。
	 //任何用户都可以访问以"/resources/","/signup", 或者 "/about"开头的URL。    
	.antMatchers("/resources/**", "/signup", "/about").permitAll()     
	 //以 "/admin/" 开头的URL只能让拥有 "ROLE_ADMIN"角色的用户访问。
	 //请注意我们使用 hasRole 方法,没有使用 "ROLE_" 前缀。               
	.antMatchers("/admin/**").hasRole("ADMIN")               
	 //任何以"/db/" 开头的URL需要同时具有 "ROLE_ADMIN" 和 "ROLE_DBA"权限的用户才可以访问。
	 //和上面一样我们的 hasRole 方法也没有使用 "ROLE_" 前缀。              
	.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")       
	 //任何以"/db/" 开头的URL只需要拥有 "ROLE_ADMIN" 和 "ROLE_DBA"其中一个权限的用户才可以访问。
   	 //和上面一样我们的 hasRole 方法也没有使用 "ROLE_" 前缀。          
	.antMatchers("/db/**").hasAnyRole("ADMIN", "DBA")    
	 //尚未匹配的任何URL都要求用户进行身份验证
	.anyRequest().authenticated() 

要保护 /metrics/confiprops/shutdown , 可以像这样调用 antMatchers() :

.antMatchers("/shutdown", "/metrics", "/configprops").access("hasRole('ADMIN')")

设置端点的上下文路径

可以通过 management.context-path 属性设置端点的上下文路径。

默认情况下,这 个属性是空的,所以Actuator的端点路径都是相对于 /actuator 路径的。

在 application.yaml 里增加如下内 容,可以让这些端点都带上 /test 前缀:

management:
  endpoints:
    web:
      base-path: /test

也可以在 application.properties 里做类似的事情:

management.endpoints.web.base-path=/test

有了这个新的路径,我们就有了公共的前缀,在为Actuator端点赋予ADMIN权限限制时就能 借助这个公共前缀:

.antMatchers("/test/**").access("hasRole('ADMIN')")

现在所有以 /test 开头的请求(包含了所有的 Actuator 端点),都只让授予了 ADMIN 权限的认证用户访问。