我来为您详细讲解“SpringBoot 监控管理模块actuator没有权限的问题解决方法”的完整攻略。
问题描述
在使用 SpringBoot 监控管理模块 actuator 时,可能会遇到没有权限的问题,例如访问 http://localhost:8080/actuator
时出现 {"timestamp":"2021-07-28T12:34:56.789+00:00","status":403,"error":"Forbidden","message":"","path":"/actuator"}
的错误信息。
解决方法
添加依赖
首先,需要在应用程序的 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.5.3</version>
</dependency>
这些依赖将使得 SpringBoot 应用程序自动集成 Spring Security。
配置 Spring Security
配置 Spring Security,实现对 actuator 监控管理模块的权限控制。在 application.properties
文件中添加以下配置:
# actuator 监控管理模块不需要认证
management.endpoint.health.show-details=never
management.endpoints.web.exposure.include=*
management.security.enabled=false
# 配置安全认证
spring.security.user.name=admin
spring.security.user.password=admin
上述配置中,我们将 actuator 监控管理模块不需要认证,同时设置了安全认证的用户名和密码,这些设置都可以根据实际情况进行修改。
配置 SpringBoot 应用程序类
在 SpringBoot 应用程序的 Application
类上添加 @EnableWebSecurity
和 @EnableGlobalMethodSecurity(prePostEnabled = true)
注解,代码示例如下:
@SpringBootApplication
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这些注解将开启 Spring Security 安全认证和全局方法安全验证。
编写控制器类
在 SpringBoot 应用程序中,编写一个控制器类,用于演示 actuator 监控管理模块的权限控制。控制器类中有两个方法,一个是不需要权限的 hello
接口,一个是需要权限的 health
接口,只有通过验证的用户才能访问。
@RestController
public class DemoController {
@GetMapping("/hello")
public String hello() {
return "Hello world";
}
@GetMapping("/health")
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
public String health() {
return "OK";
}
}
在上述代码中,我们使用了 @PreAuthorize("hasAuthority('ROLE_ADMIN')")
注解,只有具有 ROLE_ADMIN
权限的用户才能访问 /health
接口。
测试访问
启动 SpringBoot 应用程序后,在浏览器中访问 http://localhost:8080/hello
接口,应该能够正常访问。
然后,访问 http://localhost:8080/actuator
,系统会提示输入用户名和密码,输入刚才配置的 admin/admin
,登陆成功后即可查看 actuator 监控管理模块的信息。
示例一
我们来看下面这个示例,其中我们定义了 admin、user 两个角色,系统管理员(admin)才有权限访问 /health
接口:
@RestController
public class DemoController {
@GetMapping("/hello")
public String hello() {
return "Hello world";
}
@GetMapping("/health")
@PreAuthorize("hasRole('admin')")
public String health() {
return "OK";
}
}
在上述代码中,我们使用了 @PreAuthorize("hasRole('admin')")
注解,只有具有 admin
权限的用户才能访问 /health
接口。
示例二
还可以通过 roles
配置角色信息,来实现更细粒度的权限控制:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/admin/dashboard")
.and()
.logout()
.logoutUrl("/logout")
.deleteCookies("JSESSIONID");
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/static/**");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("{noop}admin")
.roles("ADMIN")
.and()
.withUser("user")
.password("{noop}user")
.roles("USER");
}
}
上述代码中,我们配置了 /admin/**
接口只有具有 ADMIN
角色的用户才有权限访问,并且通过 inMemoryAuthentication()
配置了两个用户,admin 和 user。其中 password("{noop}admin")
用于禁用 passwordEncoder。
结语
以上就是“SpringBoot 监控管理模块actuator没有权限的问题解决方法”的完整攻略。通过上述步骤的操作,即可成功解决权限问题,并实现精细的权限控制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 监控管理模块actuator没有权限的问题解决方法 - Python技术站