保护 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 权限的认证用户访问。