Spring Boot 为所有的内部日志使用 Commons Logging,但是开放底层日志实现。为 Java Util Logging、Log4J2 和 Logback 提供了默认配置。在不同情况下,日志记录器都预先配置为使用控制台输出,同时还提供可选的文件输出。 默认情况下,如果你使用启动器,则使用 Logback 进行日志记录。还包括适当的 Logback 路由,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库都能正常工作。
Spring Boot 默认的日志输出类似于以下示例: 2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52 2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms 2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 输出下列项目:
默认的日志配置在写日志时会将它们回显到控制台。默认情况下, $ java -jar myapp.jar --debug
当启用 debug 模式时,一系列核心记录器(嵌入式容器、Hibernate 和 Spring Boot)被配置成输出更多信息。启用 debug 模式不会配置应用程序记录所有的
或者,你可以通过
如果你的终端支持 ANSI,则可以使用颜色输出来帮助可读性。你可以将
颜色编码是通过使用 %clr(%5p) 下表描述了日志级别到颜色的映射:
或者,你可以通过将其作为转换的选项指定颜色或样式来使用。例如,要使文本为黄色,请使用以下设置: %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} 支持以下颜色和样式:
默认情况下,Spring Boot 只记录到控制台,不写入日志文件。如果除了控制台输出之外,还需要写入日志文件,则需要设置
下表展示了如何将 表格 26.1. 日志属性
日志文件在达到 10 MB 时切换,与控制台输出一样,默认情况下记录
所有 Spring Boot 支持的日志系统都可以在 Spring
下面的示例展示了 logging.level.root=WARN logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERROR
可以通过在类路径上包含适当的库来激活各种日志记录系统,并可通过在类路径的根目录或在 Spring
你还可以通过使用
根据日志记录系统,加载以下文件:
为了帮助定制,一些其它属性从 Spring
所有支持的日志记录系统在解析它们的配置文件时都可以查询系统属性。参见
Spring Boot 包含一些 Logback 进行高级配置的扩展。可以在
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]] ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
<springProfile name="staging"> <!-- configuration to be enabled when the "staging" profile is active --> </springProfile> <springProfile name="dev | staging"> <!-- configuration to be enabled when the "dev" or "staging" profiles are active --> </springProfile> <springProfile name="!production"> <!-- configuration to be enabled when the "production" profile is not active --> </springProfile>
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host" defaultValue="localhost"/> <appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender"> <remoteHost>${fluentHost}</remoteHost> ... </appender>
Spring Boot 非常适合 web 应用程序开发。你可以使用嵌入式 Tomcat、Jetty、Undertow 或 Netty 来创建一个独立的 HTTP 服务器。大多数 web 应用程序使用 如果你还没开发过一个 Spring Boot web 应用程序,可以参考新手入门部分的 "Hello World!" 示例。
Spring Web MVC 框架(通常称为“Spring MVC”)是一个丰富的 “model view controller” web 框架。Spring MVC 允许你创建特殊的
下面的代码展示了一个服务于 JSON 数据的典型的 @RestController @RequestMapping(value="/users") public class MyRestController { @RequestMapping(value="/{user}", method=RequestMethod.GET) public User getUser(@PathVariable Long user) { // ... } @RequestMapping(value="/{user}/customers", method=RequestMethod.GET) List<Customer> getUserCustomers(@PathVariable Long user) { // ... } @RequestMapping(value="/{user}", method=RequestMethod.DELETE) public User deleteUser(@PathVariable Long user) { // ... } } Spring MVC 是核心 Spring 框架的一部分,在参考文档中有详细的信息。spring.io/guides 上也有几个涵盖 Spring MVC 的指南。 Spring Boot 为 Spring MVC 提供了适用于大多数应用程序的自动配置。 自动配置在 Spring 默认值之上添加以下特性:
如果你想保持 Spring Boot MVC 的特性,并希望添加额外的 MVC 配置(拦截器、格式化程序、视图控制器和其它特性),则可以添加
如果你想完全控制 Spring MVC,则可以添加使用
Spring MVC 使用
如果需要添加或自定义转换器,可以使用 Spring Boot 的 import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.context.annotation.*; import org.springframework.http.converter.*; @Configuration public class MyConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> additional = ... HttpMessageConverter<?> another = ... return new HttpMessageConverters(additional, another); } }
在上下文中存在的任何
如果你使用 Jackson 来序列化和反序列化 JSON 数据,则可能需要编写自己的
可以直接在 import java.io.*; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import org.springframework.boot.jackson.*; @JsonComponent public class Example { public static class Serializer extends JsonSerializer<SomeObject> { // ... } public static class Deserializer extends JsonDeserializer<SomeObject> { // ... } }
Spring Boot 还提供了
Spring MVC 有一个用于从绑定错误中渲染错误消息的错误代码生成策略:
默认情况下,Spring Boot 从类路径或
在一个独立的 web 应用程序中,容器的默认 servlet 也被启用并作为返回,如果 Spring 决定不处理它,则从
默认情况下,资源映射到 spring.mvc.static-path-pattern=/resources/**
你还可以通过使用
除了前面提到的标准静态资源位置之外,还有 Webjars 内容制造的特殊情况。任何带有
Spring Boot 还支持 Spring MVC 提供的高级资源处理功能,允许使用缓存中断静态资源或使用 Webjars 版本未知 URL 等例子。
若要为 Webjars 使用版本未知 URL,请添加
为了使用缓存中断,以下配置为所有静态资源配置缓存中断的解决方案,在 URL 中有效的添加内容 hash,例如 spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/**
当动态加载资源时,例如,使用 JavaScript 模块加载时,重命名文件不是一个选项。这就是为什么其它策略也得到支持和结合。一个固定策略是在 URL 中添加静态版本字符串,而不是更改文件名,如下面的示例所示: spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/** spring.resources.chain.strategy.fixed.enabled=true spring.resources.chain.strategy.fixed.paths=/js/lib/ spring.resources.chain.strategy.fixed.version=v12
使用此配置,位于
查看
Spring Boot 既支持静态模板又支持模板欢迎页面。它首先在配置的静态内容位置中查找一个
Spring MVC 可以通过查看请求路径并将其匹配到应用程序中定义的映射(例如,在控制器方法上的
Spring Boot 默认选择禁用后缀模式匹配,这意味着类似于
还有其它方法来处理 HTTP 客户端,它们不总是发送正确的接收请求头。为代替使用后缀匹配,我们可以使用查询参数来确保像 spring.mvc.contentnegotiation.favor-parameter=true # We can change the parameter name, which is "format" by default: # spring.mvc.contentnegotiation.parameter-name=myparam # We can also register additional file extensions/media types with: spring.mvc.contentnegotiation.media-types.markdown=text/markdown 如果你理解这些注意事项,并且仍然希望应用程序使用后缀模式匹配,则需要以下配置: spring.mvc.contentnegotiation.favor-path-extension=true # You can also restrict that feature to known extensions only # spring.mvc.pathmatch.use-registered-suffix-pattern=true # We can also register additional file extensions/media types with: # spring.mvc.contentnegotiation.media-types.adoc=text/asciidoc
Spring MVC 使用 除了 REST web 服务之外,还可以使用 Spring MVC 来服务动态 HTML 内容。Spring MVC 支持多种模板技术,包括 Thymeleaf、FreeMarker 和 JSP。此外,许多其它模板引擎也包含它们自己的 Spring MVC 集成。 Spring Boot 包含以下模板引擎的自动配置支持:
当使用默认配置的这些模板引擎时,你的模板将自动从
默认情况下,Spring Boot 提供一个
你还可以定义一个用 @ControllerAdvice(basePackageClasses = AcmeController.class) public class AcmeControllerAdvice extends ResponseEntityExceptionHandler { @ExceptionHandler(YourException.class) @ResponseBody ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) { HttpStatus status = getStatus(request); return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status); } private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode == null) { return HttpStatus.INTERNAL_SERVER_ERROR; } return HttpStatus.valueOf(statusCode); } }
在前面的示例中,如果
如果你想要为给定的状态代码显示自定义 HTML 错误页,可以将文件添加到
例如,要将 src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
要使用 FreeMarker 模版映射所有 src/ +- main/ +- java/ | + <source code> +- resources/ +- templates/ +- error/ | +- 5xx.ftl +- <other templates>
对于更复杂的映射,还可以添加实现 public class MyErrorViewResolver implements ErrorViewResolver { @Override public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) { // Use the request or status to optionally return a ModelAndView return ... } }
你还可以使用常规的 Spring MVC 特性,例如
对于不使用 Spring MVC 的应用程序,可以使用 @Bean public ErrorPageRegistrar errorPageRegistrar(){ return new MyErrorPageRegistrar(); } // ... private static class MyErrorPageRegistrar implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400")); } }
@Bean public FilterRegistrationBean myFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); ... registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); return registration; }
请注意,默认的
警告:当部署到 servlet 容器时,Spring Boot 使用其错误页面过滤器将具有错误状态的请求转发到适当的错误页。如果响应尚未提交,则只能将请求转发到正确的错误页。默认情况下,WebSphere Application Server 8.0 和稍后在成功完成 servlet 的服务方法时提交响应。你应该通过将
如果你开发了一个使用超媒体的 RESTful API,Spring Boot 为 Spring HATEOAS 提供了自动配置,它可以很好地应用于大多数应用程序。自动配置替代了使用
可以使用 跨域资源共享(CORS)是由大多数浏览器实现的 W3C 规范,它允许你灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不太强大的方法,如 IFRAME 或 JSONP。
对于版本 4.2,Spring MVC 支持 CORS。在 Spring Boot 应用程序中使用控制器方法 CORS 配置与 @Configuration public class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**"); } }; } } Spring WebFlux 是在 Spring Framework 5.0 中引入的一种新的响应式 web 框架。与 Spring MVC 不同的是,它不需要 Servlet API,完全异步和非阻塞,并通过 Reactor 项目实现 Reactive Streams。 Spring WebFlux 有两个特点:函数式和基于注解。基于注解是一个非常接近 Spring MVC 模型,如下面的示例所示: @RestController @RequestMapping("/users") public class MyRestController { @GetMapping("/{user}") public Mono<User> getUser(@PathVariable Long user) { // ... } @GetMapping("/{user}/customers") public Flux<Customer> getUserCustomers(@PathVariable Long user) { // ... } @DeleteMapping("/{user}") public Mono<User> deleteUser(@PathVariable Long user) { // ... } } “WebFlux.fn”,一个函数式变体,将路由配置与请求的实际处理分开,如下面的示例所示: @Configuration public class RoutingConfiguration { @Bean public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) { return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser) .andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers) .andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser); } } @Component public class UserHandler { public Mono<ServerResponse> getUser(ServerRequest request) { // ... } public Mono<ServerResponse> getUserCustomers(ServerRequest request) { // ... } public Mono<ServerResponse> deleteUser(ServerRequest request) { // ... } } WebFlux 是 Spring Framework 的一部分,其参考文档中有详细的信息。
为了开始,在你的应用程序中添加
Spring Boot 为 Spring WebFlux 提供了自动配置,这与大多数应用程序都工作的很好。 自动配置在 Spring 默认值之上添加了以下特性:
如果你想保持 Spring Boot WebFlux 特性,并希望添加额外的 WebFlux 配置,你可以添加自己的
如果你想完全控制 Spring WebFlux,可以添加自己的
Spring WebFlux 使用
Spring Boot 通过使用
如果需要添加或自定义编解码器,可以创建自定义的 import org.springframework.boot.web.codec.CodecCustomizer; @Configuration public class MyConfiguration { @Bean public CodecCustomizer myCodecCustomizer() { return codecConfigurer -> { // ... } } } 你还可以利用 Boot 的自定义 JSON 序列化器和反序列化器。
默认情况下,Spring Boot 从类路径中一个名为
默认情况下,资源映射到 spring.webflux.static-path-pattern=/resources/**
还可以使用
除了前面列出的标准静态资源位置之外,还对 Webjars 内容进行了特殊处理。任何带有路径
除了 REST web 服务之外,还可以使用 Spring WebFlux 服务动态 HTML 内容。Spring WebFlux 支持多种模板技术,包括 Thymeleaf、FreeMarker 和 Mustache。 Spring Boot 包含以下模板引擎的自动配置支持:
当使用默认配置的这些模板引擎时,你的模板将自动从
Spring Boot 提供了一个
定制此功能的第一步通常涉及使用现有的机制,但替换或扩充错误内容。为此,可以添加一个类型为
若要更改错误处理行为,可以实现 public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler { // Define constructor here @Override protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) { return RouterFunctions .route(aPredicate, aHandler) .andRoute(anotherPredicate, anotherHandler); } }
对于更完整的描述,你可以直接写
如果你想要为给定的状态代码显示自定义 HTML 错误页,可以将文件添加到
例如,要将 src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
要使用 Mustache 模版映射所有 src/ +- main/ +- java/ | + <source code> +- resources/ +- templates/ +- error/ | +- 5xx.mustache +- <other templates>
Spring WebFlux 提供了一个可以实现过滤 HTTP 请求响应交换的
在过滤器的顺序很重要的情况下,它们可以实现
如果你喜欢使用 REST 端点的 JAX-RS 编程模型,可以使用可用的实现之一而不是 Spring MVC。Jersey 和 Apache CXF 的工作非常出色。CXF 要求你将其
要开始使用 Jersey,将 @Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(Endpoint.class); } }
对于更高级的自定义,你还可以注册任意数量的 bean,以实现
所有注册端点都应该是带有 HTTP 资源注解的 @Component @Path("/hello") public class Endpoint { @GET public String message() { return "Hello"; } }
由于
默认情况下,Jersey 在 这有一个 Jersey 样例,你可以看到如何设置。
Spring Boot 包含对嵌入式 Tomcat、Jetty 和 Undertow 服务器的支持。大多数开发人员使用适当的启动器来获得完全配置的实例。默认情况下,嵌入式服务器监听端口
使用嵌入式 servlet 容器时,可以使用 Spring bean 或通过扫描 Servlet 组件尊从 servlet 规范来注册servlet、过滤器和所有监听器(如
任何一个
默认情况下,如果上下文仅包含单个 Servlet,则将其映射到
如果基于约定的映射不够灵活,你可以使用 Spring Boot 具有许多可以定义过滤器 bean 的自动配置。这里有几个过滤器的例子和它们各自的顺序(低阶值意味着更高的优先级):
通常让过滤器 bean 无序是安全。
如果需要特定的顺序,则应避免配置在
嵌入式 servlet 容器不直接执行 Servlet 3.0+
如果需要在 Spring Boot 应用程序中执行 servlet 上下文初始化,则应该注册一个实现
在底层,Spring Boot 使用不同类型的
公共 servlet 容器设置可以通过使用 Spring 常用服务器设置包括:
Spring Boot 尝试尽可能多地公开公共设置,但这并不总是可能的。对于这些情况,专用命名空间提供服务器特定的自定义(参见
如果你需要以编程方式配置嵌入式 servlet 容器,则可以注册一个实现 import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.stereotype.Component; @Component public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { @Override public void customize(ConfigurableServletWebServerFactory server) { server.setPort(9000); } }
如果前面的定制技术太有限,你可以自己注册 @Bean public ConfigurableServletWebServerFactory webServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.setPort(9000); factory.setSessionTimeout(10, TimeUnit.MINUTES); factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html")); return factory; } 设置器用于许多配置选项。还提供了几种保护方法“钩子”,如果你需要做一些更异乎寻常的事情。更多详情请参阅源代码文档。
如果 Spring Security 在类路径上,那么默认情况下 web 应用程序将得到安全保护。Spring Boot 依赖于 Spring Security 的内容协商策略来确定是否使用
默认 Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
你可以通过提供 在 web 应用程序中默认的基本特征是:
你可以通过为其添加 bean 来提供不同的
默认安全配置时在
若要关闭
可以通过添加自定义
类似于 Spring MVC 应用程序,你可以通过添加
若要关闭
可以通过添加自定义
例如,你可以通过添加一些类似的内容来自定义安全配置: @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { return http .authorizeExchange() .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() .pathMatchers("/foo", "/bar") .authenticated().and() .formLogin().and() .build(); } OAuth2 是 Spring 支持的一种广泛使用的授权框架。
如果你的类路径上有
你可以在 spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=http://my-auth-server/oauth/authorize spring.security.oauth2.client.provider.my-oauth-provider.token-uri=http://my-auth-server/oauth/token spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=http://my-auth-server/userinfo spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=http://my-auth-server/token_keys spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
对于支持 OpenID 连接发现的 OpenID 连接提供者,可以进一步简化配置。提供者需要配置一个 spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
你可以在 spring.security.oauth2.client.registration.login.my-client-1.client-id=abcd spring.security.oauth2.client.registration.login.my-client-1.client-secret=password spring.security.oauth2.client.registration.login.my-client-1.client-name=Client for user scope spring.security.oauth2.client.registration.login.my-client-1.provider=my-oauth-provider spring.security.oauth2.client.registration.login.my-client-1.scope=user spring.security.oauth2.client.registration.login.my-client-1.redirect-uri=http://localhost:8080/login/oauth2/code/my-client-1 spring.security.oauth2.client.registration.login.my-client-1.client-authentication-method=basic spring.security.oauth2.client.registration.login.my-client-1.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.login.my-client-2.client-id=abcd spring.security.oauth2.client.registration.login.my-client-2.client-secret=password spring.security.oauth2.client.registration.login.my-client-2.client-name=Client for email scope spring.security.oauth2.client.registration.login.my-client-2.provider=my-oauth-provider spring.security.oauth2.client.registration.login.my-client-2.scope=email spring.security.oauth2.client.registration.login.my-client-2.redirect-uri=http://localhost:8080/login/oauth2/code/my-client-2 spring.security.oauth2.client.registration.login.my-client-2.client-authentication-method=basic spring.security.oauth2.client.registration.login.my-client-2.authorization-grant-type=authorization_code
默认情况下,Spring Security 的 public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .oauth2Login() .redirectionEndpoint() .baseUri("/custom-callback"); } } 相同的属性适用于 servlet 和响应式应用程序。
你可以在 spring.security.oauth2.client.registration.authorization-code.my-client-1.client-id=abcd spring.security.oauth2.client.registration.authorization-code.my-client-1.client-secret=password spring.security.oauth2.client.registration.authorization-code.my-client-1.client-name=Client for user scope spring.security.oauth2.client.registration.authorization-code.my-client-1.provider=my-oauth-provider spring.security.oauth2.client.registration.authorization-code.my-client-1.scope=user spring.security.oauth2.client.registration.authorization-code.my-client-1.redirect-uri=http://my-redirect-uri.com spring.security.oauth2.client.registration.authorization-code.my-client-1.client-authentication-method=basic spring.security.oauth2.client.registration.authorization-code.my-client-1.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.authorization-code.my-client-2.client-id=abcd spring.security.oauth2.client.registration.authorization-code.my-client-2.client-secret=password spring.security.oauth2.client.registration.authorization-code.my-client-2.client-name=Client for email scope spring.security.oauth2.client.registration.authorization-code.my-client-2.provider=my-oauth-provider spring.security.oauth2.client.registration.authorization-code.my-client-2.scope=email spring.security.oauth2.client.registration.authorization-code.my-client-2.redirect-uri=http://my-redirect-uri.com spring.security.oauth2.client.registration.authorization-code.my-client-2.client-authentication-method=basic spring.security.oauth2.client.registration.authorization-code.my-client-2.authorization-grant-type=authorization_code
对于常见的 OAuth2 和 OpenID 提供者,包括 Google、Github、Facebook 和 Okta,我们提供了提供者的缺省设置(分别是 如果不需要自定义这些提供者,可以将提供者属性设置为需要推断默认值的提供者属性。此外,如果客户端的 ID 与默认支持的提供者匹配,Spring Boot 也会推断出这一点。 换句话说,下面的示例中的两个配置使用 Google 提供者: spring.security.oauth2.client.registration.login.my-client.client-id=abcd spring.security.oauth2.client.registration.login.my-client.client-secret=password spring.security.oauth2.client.registration.login.my-client.provider=google spring.security.oauth2.client.registration.login.google.client-id=abcd spring.security.oauth2.client.registration.login.google.client-secret=password
如果在类路径上有 spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
相同的属性适用于 servlet 和响应式应用程序。
或者,你可以为 servlet 应用程序定义自己的
目前,Spring Security 不支持实现 OAuth 2.0 授权服务。然而,这个功能可以从 Spring Security OAuth 项目获得,它最终将被 Spring Security 完全取代。在此之前,你可以使用
出于安全目的,默认情况下禁用除
如果 Spring Security 在类路径上,并且没有其它 WebSecurityConfigurerAdapter,则执行器通过 Spring Boot 自动配置进行安全保护。如果你定义了自定义
由于 Spring Boot 依赖于 Spring Security 的默认值,因此默认情况下将启用 CSRF 保护。这意味着在使用默认安全配置时,需要一个
关于 CSRF 保护的附加信息可以在 Spring Security 参考指南中找到。 |