- 1 Spring Boot文档
- 1.1 关于这篇文档
- 1.2 获取帮助
- 1.3 第一步
- 1.4 使用Spring Boot
- 1.5 了解Spring Boot功能
- 1.6 转向生产
- 1.7 深入问题
- 2 入门
- 2.1 Spring Boot介绍
- 2.2 系统要求
- 2.3 安装Spring Boot
- 2.4 开发您的第一个Spring Boot应用程序
- 2.5 接下来要阅读的内容
- 3 使用Spring Boot
- 3.1 构建系统
- 3.1.1 依赖管理
- 3.2 结构化您的代码
- 3.3 配置类
- 3.4 自动配置
- 3.5 Spring Beans和依赖注入
- 3.6 使用@SpringBootApplication注解
- 3.7 运行您的应用程序
- 3.8 开发者工具
- 3.9 打包用于生产中的应用
- 3.10 接下来要阅读的内容
- 4 Spring Boot功能
- 4.1 SpringApplication
- 4.2 外部配置
- 4.3 Profiles
- 4.4 日志
- 4.5 国际化
- 4.6 JSON
- 4.7 开发Web应用程序
- 4.8 安全
- 4.9 使用SQL数据库
- 4.10 使用NoSQL技术
- 4.11 缓存
- 4.12 消息
- 4.13 使用RestTemplate调用REST服务
- 4.14 使用WebClient调用REST服务
- 4.15 校验
- 4.16 发送邮件
- 4.17 使用JTA的分布式事务
- 4.18 Hazelcast
- 4.19 Quartz Scheduler
- 4.20 任务执行和调度
- 4.21 Spring Integration
- 4.22 Spring Session
- 4.23 JMX的监控和管理
- 4.23 测试
- 4.25 WebSockets
- 4.26 Web Service
- 4.27 创建自己的自动配置
- 4.28 Kotlin支持
- 4.29 接下来要阅读的内容
- 5 Spring Boot Actuator: 生产就绪功能
- 5.1 启用生产就绪功能
- 5.2 Endpoints
- 5.3 通过HTTP进行监控和管理
- 5.4 JMX的监控和管理
- 5.5 Loggers
- 5.6 Metrics
- 5.7 审计
- 5.8 HTTP跟踪
- 5.9 进程监控
- 5.10 Cloud Foundry支持
- 5.11 接下来要阅读的内容
- 6 部署Spring Boot应用程序
- 6.1 部署到Cloud
- 6.2 安装Spring Boot应用程序
- 6.3 接下来要阅读的内容
- 7 Spring Boot CLI
- 7.1 安装CLI
- 7.2 使用CLI
- 7.3 使用Groovy Bean DSL开发应用程序
- 7.4 使用settings.xml配置CLI
- 7.5 接下来要阅读的内容
- 8 构建工具插件
- 8.1 Spring Boot Maven插件
- 8.2 Spring Boot Gradle插件
- 8.3 Spring Boot AntLib模块
- 8.4 支持其他构建系统
- 8.5 接下来要阅读的内容
- 9 ‘How-to’ 指南
- 9.1 Spring Boot应用
- 9.2 属性和配置
- 9.3 嵌入式Web服务器
- 9.4 Spring MVC
4.8 安全
如果Spring Security位于类路径上,则默认情况下Web应用程序是安全的。 Spring Boot依赖于Spring Security的内容协商策略来确定是使用httpBasic还是formLogin。 要向Web应用程序添加方法级安全性,还可以使用所需设置添加@EnableGlobalMethodSecurity。 其他信息可以在Spring Security Reference Guide中找到。
默认的UserDetailsService只有一个用户。 用户名是user,密码是随机的,在应用程序启动时以INFO级别打印,如以下示例所示:
Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
如果您对日志记录配置进行微调,请确保将org.springframework.boot.autoconfigure.security类别设置为记录INFO级别的消息。 否则,不会打印默认密码。
您可以通过提供spring.security.user.name和spring.security.user.password来更改用户名和密码。
您在Web应用程序中默认获得的基本功能包括:
- UserDetailsService(或WebFlux应用程序中的ReactiveUserDetailsService)具有内存存储的bean和具有生成密码的单个用户(有关用户属性,请参阅SecurityProperties.User)。
- 基于表单的登录或HTTP基本安全性(取决于Content-Type)用于整个应用程序(如果执行器在类路径上,则包括执行器端点)。
- 用于发布身份验证事件的DefaultAuthenticationEventPublisher。
您可以通过为其添加bean来提供不同的AuthenticationEventPublisher。
4.8.1 MVC安全
默认安全配置在SecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现。 SecurityAutoConfiguration导入用于Web安全的SpringBootWebSecurityConfiguration和UserDetailsServiceAutoConfiguration配置身份验证,这也适用于非Web应用程序。 要完全关闭默认Web应用程序安全性配置,可以添加WebSecurityConfigurerAdapter类型的bean(这样做不会禁用UserDetailsService配置或Actuator的安全性)。
要关闭UserDetailsService配置,您可以添加UserDetailsService,AuthenticationProvider或AuthenticationManager类型的bean。 Spring Boot示例中有几个安全的应用程序可以帮助您开始使用常见的用例。
可以通过添加自定义WebSecurityConfigurerAdapter来覆盖访问规则。 Spring Boot提供了便捷方法,可用于覆盖执行器端点和静态资源的访问规则。 EndpointRequest可用于创建基于management.endpoints.web.base-path属性的RequestMatcher。 PathRequest可用于为常用位置中的资源创建RequestMatcher。
4.8.2 WebFlux安全
与Spring MVC应用程序类似,您可以通过添加spring-boot-starter-security依赖项来保护WebFlux应用程序。 默认安全配置在ReactiveSecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现。 ReactiveSecurityAutoConfiguration导入WebFluxSecurityConfiguration以实现Web安全性,UserDetailsServiceAutoConfiguration配置身份验证,这也适用于非Web应用程序。 要完全关闭默认Web应用程序安全配置,可以添加WebFilterChainProxy类型的bean(这样做不会禁用UserDetailsService配置或Actuator的安全性)。
要关闭UserDetailsService配置,您可以添加ReactiveUserDetailsService或ReactiveAuthenticationManager类型的bean。
可以通过添加自定义SecurityWebFilterChain来配置访问规则。 Spring Boot提供了便捷方法,可用于覆盖执行器端点和静态资源的访问规则。 EndpointRequest可用于创建基于management.endpoints.web.base-path属性的ServerWebExchangeMatcher。
PathRequest可用于为常用位置中的资源创建ServerWebExchangeMatcher。
例如,您可以通过添加以下内容来自定义安全配置:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.pathMatchers("/foo", "/bar")
.authenticated().and()
.formLogin().and()
.build();
}
4.8.3 OAuth2
OAuth2是Spring支持的一种广泛使用的授权框架。
4.8.3.1 客户端
如果在类路径中有spring-security-oauth2-client,则可以利用一些自动配置来轻松设置OAuth2 / Open ID Connect客户端。 此配置使用OAuth2ClientProperties下的属性。 相同的属性适用于servlet和反应式应用程序。
您可以在spring.security.oauth2.client前缀下注册多个OAuth2客户端和提供程序,如以下示例所示:
spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri-template=http://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri-template=http://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
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 Connect发现的OpenID Connect提供程序,可以进一步简化配置。 提供程序需要配置issuer-uri,它是它声明为其颁发者标识符的URI。 例如,如果提供的issuer-uri是“https://example.com”,则将对“https://example.com/.well-known/openid-configuration”进行OpenID提供商配置请求。 结果预计将是OpenID提供程序配置响应。 以下示例显示如何使用issuer-uri配置OpenID Connect Provider:
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
默认情况下,Spring Security的OAuth2LoginAuthenticationFilter仅处理与/login/oauth2/code/*匹配的URL。 如果要自定义redirect-uri以使用其他模式,则需要提供配置以处理该自定义模式。 例如,对于servlet应用程序,您可以添加类似于以下内容的WebSecurityConfigurerAdapter:
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.redirectionEndpoint()
.baseUri("/custom-callback");
}
}
1)OAuth2客户端注册常见提供商
对于常见的OAuth2和OpenID提供商,包括Google,Github,Facebook和Okta,我们提供了一组提供商默认设置(分别为google,github,facebook和okta)。
如果不需要自定义这些提供程序,则可以将Provider属性设置为需要推断默认值的提供程序属性。此外,如果客户端注册的键与默认支持的提供程序匹配,SpringBoot也会推断这一点。
换句话说,以下示例中的两个配置使用Google提供程序:
spring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google
spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
4.8.3.2 资源服务器
如果在类路径上有spring-security-oauth2-resource-server,只要指定了JWK Set URI或OIDC Issuer URI,Spring Boot就可以设置OAuth2资源服务器,如以下示例所示:
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应用程序定义自己的JwtDecoder bean,或者为响应式应用程序定义ReactiveJwtDecoder。
4.8.3.3 授权服务器
目前,Spring Security不支持实施OAuth 2.0授权服务器。 但是,此功能可从Spring Security OAuth项目获得,该项目最终将完全被Spring Security取代。 在此之前,您可以使用spring-security-oauth2-autoconfigure模块轻松设置OAuth 2.0授权服务器; 请参阅其文档以获取说明
4.8.4 执行器安全
出于安全考虑,默认情况下禁用除/health和/info之外的所有执行器。 management.endpoints.web.exposure.include属性可用于启用执行器。
如果Spring Security位于类路径上且没有其他WebSecurityConfigurerAdapter,则除了/health和/info之外的所有执行程序都由Spring Boot自动配置保护。 如果您定义了自定义WebSecurityConfigurerAdapter,则Spring Boot自动配置将退回,您将完全控制执行器访问规则。
在设置management.endpoints.web.exposure.include之前,请确保暴露的执行器不包含敏感信息和(或)通过将它们放在防火墙后面或通过Spring Security之类的东西来保护。
4.8.4.1 伪造跨域请求保护
由于Spring Boot依赖于Spring Security的默认值,因此默认情况下会启用CSRF保护。 这意味着当使用默认安全配置时,需要POST(关闭和记录器端点),PUT或DELETE的执行器端点将获得403禁止错误。
我们建议仅在创建非浏览器客户端使用的服务时才完全禁用CSRF保护。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论