如果你正在开发一个Spring MVC应用,Spring Boot执行器自动将所有启用的端点通过HTTP暴露出去。默认约定使用端点的id
作为URL路径,例如,health
暴露为/health
。
如果你的项目添加了‘Spring Security’依赖,所有通过HTTP暴露的敏感端点都会受到保护,默认情况下会使用用户名为user
的基本认证(basic authentication),产生的密码会在应用启动时打印到控制台上。
注 在应用启动时会记录生成的密码,具体搜索Using default security password
。
你可以使用Spring属性改变用户名,密码和访问端点需要的安全角色。例如,你可以将以下配置添加到application.properties
中:
security.user.name=admin
security.user.password=secret
management.security.role=SUPERUSER
注 如果不使用Spring Security,并且公开暴露HTTP端点,你应该慎重考虑启用哪些端点,具体参考Section 46.1, “Customizing endpoints”。
有时将所有管理端点划分到单个路径下是有用的。例如,/info
可能已被应用占用,你可以用management.contextPath
属性为管理端点设置一个前缀:
management.context-path=/manage
以上的application.properties
示例将把端点从/{id}
改为/manage/{id}
(比如/manage/info
)。
你也可以改变端点的id
(使用endpoints.{name}.id
)来改变MVC端点的默认资源路径,合法的端点ids只能由字母数字组成(因为它们可以暴露到很多地方,包括不允许特殊字符的JMX对象name)。MVC路径也可以通过配置endpoints.{name}.path
来单独改变,Spring Boot不会校验这些值(所以你可以使用URL中任何合法的字符)。例如,想要改变/health
端点路径为/ping/me
,你可以设置endpoints.health.path=/ping/me
。
注 如果你提供一个自定义MvcEndpoint
,记得包含一个可设置的path
属性,并像标准MVC端点那样将该属性默认设置为/{id}
(具体可参考HealthMvcEndpoint
)。如果你的自定义端点是一个Endpoint
(不是MvcEndpoint
),Spring Boot将会为你分配路径。
对于基于云的部署,使用默认的HTTP端口暴露管理端点(endpoints)是明智的选择。然而,如果你的应用是在自己的数据中心运行,那你可能倾向于使用一个不同的HTTP端口来暴露端点。management.port
属性可以用来改变HTTP端口:
management.port=8081
由于你的管理端口经常被防火墙保护,不对外暴露也就不需要保护管理端点,即使你的主应用是受保护的。在这种情况下,classpath下会存在Spring Security库,你可以设置以下属性来禁用安全管理策略(management security):
management.security.enabled=false
(如果classpath下不存在Spring Security,那也就不需要显式的以这种方式来禁用安全管理策略,它甚至可能会破坏应用程序。)
当配置使用一个自定义端口时,管理服务器可以通过各种management.ssl.*
属性配置自己的SSL。例如,以下配置允许通过HTTP访问管理服务器,通过HTTPS访问主应用:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enable=false
或者,主应用服务器和管理服务器都使用SSL,但key stores不一样:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enable=true
management.ssl.key-store=classpath:management.jks
management.ssl.key-password=secret
你可以通过设置management.address
属性来定义管理端点使用的地址,这在你只想监听内部或面向生产环境的网络,或只监听来自localhost
的连接时非常有用。
注 如果端口跟主应用服务器不一样,你只能监听一个不同的地址。
下面的application.properties示例不允许远程访问管理服务器:
management.port=8081
management.address=127.0.0.1
如果不想通过HTTP暴露端点,你可以将管理端口设置为-1:
management.port=-1
health
端点暴露的信息依赖于是否为匿名访问,应用是否受保护。默认情况下,当匿名访问一个受保护的应用时,任何有关服务器的健康详情都被隐藏了,该端点只简单的展示服务器运行状况(up或down)。此外,响应会被缓存一个可配置的时间段以防止端点被用于'拒绝服务'攻击,你可以通过endpoints.health.time-to-live
属性设置缓存时间(单位为毫秒),默认为1000毫秒,也就是1秒。
你可以增强上述限制,从而只允许认证用户完全访问一个受保护应用的health
端点,将endpoints.health.sensitive
设为true
可以实现该效果,具体可查看以下总结(sensitive
标识值为"false"的默认加粗):
management.security.enabled |
endpoints.health.sensitive |
未认证 | 认证 |
---|---|---|---|
false | false | 全部内容 | 全部内容 |
false | true | 只能查看Status | 全部内容 |
true | false | 只能查看Status | 全部内容 |
true | true | 不能查看任何内容 | 全部内容 |