20191118 Spring Boot官方文档学习(4.9)
4.9。安全
如果Spring Security
在类路径上,则默认情况下Web应用程序是采用的。Spring Boot依靠Spring Security的内容协商策略来确定使用httpBasic
还是formLogin
。要将方法级安全性添加到Web应用程序,您还可以添加@EnableGlobalMethodSecurity
所需的设置。
默认的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
bean (或WebFlux应用程序中的ReactiveUserDetailsService
)和一个具有生成的密码的单个用户(请参考SecurityProperties.User
的属性)。 - 整个应用程序的基于表单的登录或
HTTP Basic
安全性(取决于请求中的Accept标头)(如果执行器位于类路径上,则包括执行器端点)。 DefaultAuthenticationEventPublisher
,用于发布身份验证事件。
您可以通过添加一个bean 来提供不同的AuthenticationEventPublisher
。
4.9.1。MVC安全
默认的安全配置在SecurityAutoConfiguration
和UserDetailsServiceAutoConfiguration
中实现。 SecurityAutoConfiguration
导入SpringBootWebSecurityConfiguration
保证Web安全性,UserDetailsServiceAutoConfiguration
配置身份验证,这在非Web应用程序中也很重要。要完全关闭默认的Web应用程序安全性配置或合并多个Spring Security组件(例如OAuth 2 Client
和Resource Server
),请添加一个WebSecurityConfigurerAdapter
类型的bean (这样做不会禁用UserDetailsService
配置或Actuator
的安全性)。
为了关闭UserDetailsService
的配置,您可以添加UserDetailsService
,AuthenticationProvider
或AuthenticationManager
类型的bean。
可以通过添加自定义WebSecurityConfigurerAdapter
来覆盖访问规则。Spring Boot提供了方便的方法,可用于覆盖执行器端点和静态资源的访问规则。 EndpointRequest
可用于创建基于management.endpoints.web.base-path
属性的RequestMatcher
。 PathRequest
可用于创建在常用RequestMatcher
资源。
4.9.2。WebFlux安全
与Spring MVC应用程序类似,您可以通过添加spring-boot-starter-security
依赖项来保护WebFlux应用程序。默认的安全配置在ReactiveSecurityAutoConfiguration
和UserDetailsServiceAutoConfiguration
中实现。 ReactiveSecurityAutoConfiguration
导入WebFluxSecurityConfiguration
保证Web安全性,UserDetailsServiceAutoConfiguration
配置身份验证,这在非Web应用程序中也很重要。要完全关闭默认的Web应用程序安全性配置,可以添加一个WebFilterChainProxy
类型的bean (这样做不会禁用UserDetailsService
配置或执行器的安全性)。
要关闭UserDetailsService
配置,可以添加类型为ReactiveUserDetailsService
或ReactiveAuthenticationManager
的Bean 。
可以通过添加自定义SecurityWebFilterChain
bean 来配置访问规则以及使用多个Spring Security组件(例如OAuth 2 Client和Resource Server)。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.9.3。OAuth2
OAuth2是Spring支持的一种广泛使用的授权框架。
Client
如果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=https://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=https://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=https://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://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=https://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
对于支持OpenID Connect discovery的 OpenID Connect提供程序,可以进一步简化配置。提供者需要配置issuer-uri
,即它声明为其发布者标识符的URI。例如,如果issuer-uri提供的是“ https://example.com”,则将OpenID Provider Configuration Request对“ https://example.com/.well-known/openid-configuration”进行标记。结果预期为OpenID Provider Configuration Response。以下示例显示如何使用issuer-uri来配置OpenID Connect提供程序:
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");
}
}
普通提供商的OAuth2客户端注册
对于常见的OAuth2和OpenID提供商,包括谷歌,Github,Facebook和Okta,我们提供了一组默认的供应商(google,github,facebook,和okta)。
如果不需要自定义这些供应商,则可以将provider属性设置为需要为其推断默认值的属性。另外,如果用于客户端注册的key与默认支持的供应商匹配,则Spring Boot也会进行推断。
换句话说,以下示例中的两个配置都使用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
Resource Server
如果spring-security-oauth2-resource-server
在类路径中,则Spring Boot可以设置OAuth2资源服务器。对于JWT配置,需要指定JWK Set URI或OIDC Issuer URI,如以下示例所示:
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/
如果授权服务器不支持JWK Set URI,则可以使用用于验证JWT签名的公共密钥来配置资源服务器。可以使用spring.security.oauth2.resourceserver.jwt.public-key-location
属性来完成此操作,该属性值需要指向包含PEM编码的x509格式的公钥的文件。
相同的属性适用于servlet和反应式应用程序。
另外,您可以为Servlet应用程序或ReactiveJwtDecoder
响应式应用程序定义自己的JwtDecoder
bean 。
如果使用不透明令牌而不是JWT,则可以配置以下属性以通过自我检查来验证令牌:
spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret
同样,相同的属性适用于servlet和反应式应用程序。
另外,您可以为Servlet应用程序定义OpaqueTokenIntrospector
bean或为响应式应用程序定义ReactiveOpaqueTokenIntrospector
bean 。
Authorization Server
当前,Spring Security不提供对实现OAuth 2.0授权服务器的支持。但是,Spring Security OAuth项目提供了此功能,最终将被Spring Security完全取代。在此之前,您可以使用spring-security-oauth2-autoconfigure
模块轻松设置OAuth 2.0授权服务器。
4.9.4。SAML 2.0
Relying Party
如果spring-security-saml2-service-provider
在类路径上,则可以利用一些自动配置功能来轻松设置SAML 2.0。此配置使用Saml2RelyingPartyProperties
的属性。
依赖方注册代表身份提供商IDP和服务提供商SP之间的配对配置。您可以在spring.security.saml2.relyingparty
前缀下注册多个依赖方,如以下示例所示:
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.verification.credentials[0].certificate-location=path-to-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.entity-id=remote-idp-entity-id1
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.sso-url=https://remoteidp1.sso.url
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.verification.credentials[0].certificate-location=path-to-other-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.entity-id=remote-idp-entity-id2
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.sso-url=https://remoteidp2.sso.url
4.9.5。Actuator Security
为了安全起见,默认情况下,除/health
和/info
以外的所有执行器都是禁用的。management.endpoints.web.exposure.include
属性可用于启用执行器。
如果Spring Security是在类路径上,并且没有其他WebSecurityConfigurerAdapter
存在,所有的执行器除了/health和/info以外,通过Spring Boot自动配置保护。如果您自定义一个WebSecurityConfigurerAdapter
,Spring Boot自动配置将退出,您将完全控制执行器访问规则。
在设置management.endpoints.web.exposure.include
之前,请确保公开的执行器不包含敏感信息,并且通过将它们放置在防火墙后面或通过诸如Spring Security之类的东西进行保护。
跨站点请求伪造(CSRF)保护
由于Spring Boot依赖于Spring Security的默认值,因此默认情况下CSRF保护是打开的。这意味着在使用默认安全性配置时,执行器端点请求POST(关闭和记录器端点)PUT或DELETE将收到403
禁止错误。
我们建议仅在创建非浏览器客户端使用的服务时完全禁用CSRF保护。
20191118 Spring Boot官方文档学习(4.9)的更多相关文章
- 20191118 Spring Boot官方文档学习(4.8)
4.8. RSocket RSocket参考 RSocket是用于字节流传输的二进制协议.它通过单个连接传递的异步消息来启用对称交互模型. Spring框架的spring-messaging模块在客户 ...
- Spring Boot 官方文档学习(一)入门及使用
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- Spring boot官方文档学习(一)
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- 20191106 Spring Boot官方文档学习(1-2)
学习内容相关信息 最新版本:2.2.0 CURRENT GA 官网地址 官方文档地址 单页版文档地址 代码生成网址 2.入门 Spring Boot的主要目标是: 为所有Spring开发提供更快且入门 ...
- 20191127 Spring Boot官方文档学习(9.1-9.3)
9."使用方法"指南 9.1.Spring Boot应用程序 9.1.1.创建自己的FailureAnalyzer FailureAnalyzer被包装在FailureAnalys ...
- 20191110 Spring Boot官方文档学习(3)
3.使用Spring Boot 3.1.构建系统 建议选择Maven或Gradle作为构建工具 每个Spring Boot版本都提供了它所支持的依赖关系的精选列表.实际上,您不需要为构建配置中的所有这 ...
- 20191128 Spring Boot官方文档学习(9.4-9.8)
9.4.Spring MVC Spring Boot有许多启动器包含Spring MVC.请注意,一些启动器包括对Spring MVC的依赖,而不是直接包含它. 9.4.1.编写JSON REST服务 ...
- 20191128 Spring Boot官方文档学习【目录】
Spring Boot文档 入门 使用Spring Boot 3.1. 构建系统 3.2. 结构化代码 3.3. 配置类 3.4. 自动配置 3.5. Spring beans和依赖注入 3.6. 使 ...
- 20191128 Spring Boot官方文档学习(9.11-9.17)
9.11.消息传递 Spring Boot提供了许多包含消息传递的启动器.本部分回答了将消息与Spring Boot一起使用所引起的问题. 9.11.1.禁用事务JMS会话 如果您的JMS代理不支持事 ...
随机推荐
- Luogu P3170 [CQOI2015]标识设计 状态压缩,轮廓线,插头DP,动态规划
看到题目显然是插头\(dp\),但是\(n\)和\(m\)的范围似乎不是很小.我们先不考虑复杂度设一下状态试试: 一共有三个连通分量,我们按照\(1,2,3\)的顺序来表示一下.轮廓线上\(0\)代表 ...
- requests中text,content,json之间的区别
response.text : 返回一个字符串\n",content : 返回二进制\n",json() : 返回对象"
- ESP8266--WIFI热点扫描
现在,通常,为了让手机连上一个WiFi热点,基本上都是打开手机设置里面的WiFi设置功能,然后会看到里面有个WiFi热点列表,然后选择你要的连接上. 基本上你只要打开手机连接WiFi功能,都会发现附近 ...
- UVALive 3523 : Knights of the Round Table (二分图+BCC)
题目链接 题意及题解参见lrj训练指南 #include<bits/stdc++.h> using namespace std; ; int n,m; int dfn[maxn],low[ ...
- AOP aspect XML 配置
/** * 00配置接入点:定义一个切入点 * execution(* com.foen.foensys.controller..*.*(..))") "*" 第一个* ...
- Git的使用及安装
1安装. 步骤一 如果是32位就安装32位,64位就安装64,任选一款. 步骤二 步骤三 步骤四 步骤五 步骤六 步骤七 步骤八 步骤九 步骤十 步骤十一 上面的安装完成以后,下面的程序包按要求安装就 ...
- Redis实战(十二)Redis实现分布式锁
序言 SET my_key my_value NX PX milliseconds 资料 如何优雅地用Redis实现分布式锁?
- Devexpress MVC Gridview
1. 根据选中的KeyValue 来获取其他field的value // Gridview settings settings.CustomJSProperties = (s, e) => { ...
- 线程工具类ThreadUtils
package yqw.java.util; public class ThreadUtils { /** * showThreadInfo * * @return ...
- Python黑科技 | Python中四种运行其他程序的方式
在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32proc ...