安全 - Security
如果Spring Security位于类路径中,则默认情况下,Web应用程序将在所有HTTP端点上使用“基本”身份验证来确保安全。要将方法级安全性添加到Web应用程序中,您还可以使用所需的设置添加@EnableGlobalMethodSecurity
。可以在Spring
Security Reference中找到更多信息。
默认的AuthenticationManager
只有一个用户(“用户”用户名和随机密码,在应用程序启动时以INFO级别打印)
Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
如果您微调日志记录配置,请确保将org.springframework.boot.autoconfigure.security
类别设置为记录INFO消息,否则将不会输出默认密码。
您可以通过提供security.user.password
来更改密码。此属性和其他有用的属性通过SecurityProperties
(属性前缀“ security”)外部化。
默认的安全配置在SecurityAutoConfiguration
以及从那里导入的类中实现(用于Web安全的SpringBootWebSecurityConfiguration
和用于身份验证配置的AuthenticationManagerConfiguration
,这也与非Web应用程序相关.
要完全关闭默认的Web应用程序安全配置,您可以添加具有@EnableWebSecurity
的bean(这不会禁用身份验证管理器配置或Actuator
的安全性)。 要对其进行自定义,通常使用外部属性和WebSecurityConfigurerAdapter
类型的Bean(例如,添加基于表单的登录名)
如果添加@EnableWebSecurity并还禁用Actuator安全性,除非添加自定义WebSecurityConfigurerAdapter,否则将获得整个应用程序的默认基于表单的登录名
要同时关闭身份验证管理器配置,你可以添加AuthenticationManager
类的的bean,活荷载通过AuthenticationManagerBuilder
自动装配到@Configuration
类中的方法来配置全局AuthenticationManager
Spring Boot示例中有几个Spring Boot samples,可以帮助您开始使用常见的用例。
在Wendy应用程序中开箱即用的基本功能:
-
具有内存存储和单个用户的
AuthenticationManager
bean(有关用户的属性,请看SecurityProperties.User
) -
忽略常见静态资源
/css/** , /js/**, /images/** , /webjars/** , **/favicon.ico
路径(不安全) -
其他端点的HTTP 基本安全性
-
发布到Spring的
ApplicationEventPublisher
的安全事件(身份验证的成功和失败,访问被拒) -
默认情况下,Spring Security 提供常见低级功能(HSTS,XSS,CSRF,缓存)处于启动状态
可以使用外部属性(security.*
)打开或者关闭以上内容或者对其进行修改.要覆盖访问规则而不像更改任何其他自动配,请添加具有@Order
(SecurityProperties.ACCESS_OVERRIDE_ORDER
)类型的WebSecurityConfigurerAdapter
类型的@Bean
并对其进行配置以满足你的需求
默认情况下,WebSecurityConfigurerAdapter将匹配任何路径。如果您不想完全覆盖Spring Boot的自动配置访问规则,则适配器必须显式配置要覆盖的路径。
OAuth2
如果您在类路径中具有spring-security-oauth2
,则可以利用一些自动配置功能来轻松设置授权或资源服务器。有关完整的详细信息,请参阅Spring Security OAuth 2 Developers
Guide
授权服务
要创建授权服务并授予访问令牌,需要使用EnableAuthorizationServer
并提供security.oauth2.client.cilent-id
和security.oauth2.client.client.secret
属性.客户端将在内存中为您注册
完成之后,您将能够使用客户端凭据来创建访问令牌
curl client:secret@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=pwd
/ token端点的基本身份验证凭据是client-id
和client-secret
。用户凭证是正常的Spring Security用户详细信息(在Spring Boot中默认为“user”和随机密码)
要自行关闭自动配置并配置Authorization Server功能,只需添加类型AuthorizationServerConfigurer
的@Bean
资源服务器 - Resource Server
要使用访问令牌,你需要一个资源服务器(可以和授权服务相同).创建资源服务很简单,只需要添加@EnableResourceServer
并提供一些配置以允许服务解码访问令牌.如果你的应用程序也是授权服务,则它已经知道如何解码令牌,无需执行其他操作.如果你的应用是独立服务,则需要为它提供更多配置.
security.oauth2.resource.user-info-uri
to use the/me
resource (e.g.https://uaa.run.pivotal.io/userinfo
on PWS)security.oauth2.resource.token-info-uri
to use the token decoding endpoint (e.g.https://uaa.run.pivotal.io/check_token
on PWS).
如果同时制定了user-info-url
和token-info-url
,则可以设置一个标志来表示誰优先(默认是prefer-token-info=true
)
另外,如果令牌是JWT,则可以替代user-info-url
或是token-info-url
,则可以配置security.oauth2.resource.jwt.key-value
对其进行本地解码(该密钥为验证密钥)
$ curl https://uaa.run.pivotal.io/token_key
{"alg":"SHA256withRSA","value":"-----BEGIN PUBLIC KEY-----\nMIIBI...\n-----END PUBLIC KEY-----\n"}
如果使用security.oauth2.resource.jwt.key-uri
,则在应用程序启动时需要运行授权服务器。如果找不到密钥,它将记录一条警告,并告诉您如何解决。
OAuth2资源由具有顺序的security.oauth2.resource.filter-order
过滤器的链保护,并且默认情况下是在过滤器之后默认情况下保护执行器端点(因此,执行器端点将保留在HTTP Basic上,除非您更改顺序)
User 中的Token 类型 - Token Type in User Info
Google和某些其他第三方身份提供者对标头中发送到用户信息端点的令牌类型名称更加严格。 默认值为“ Bearer”,它适合大多数提供商并符合规范,但是如果需要更改它,则可以设置security.oauth2.resource.token-type
自定义用户信息RestTemplate Customizing the User Info RestTemplate
如果您有一个user-info-uri
,则资源服务器功能会在内部使用OAuth2RestTemplate
来获取用户详细信息以进行身份验证.它作为UserInfoRestTemplateFactory
类型的@Bean
提供。对于大多数提供程序来说,默认值应该是合适的,但有时您可能需要添加其他拦截器,或更改请求身份验证器(令牌将其附加到传出请求的方式)。要添加定制,只需创建一个类型为的bean.要添加定制,只需创建一个类型为的bean
UserInfoRestTemplateCustomizer-
它具有单个方法,该方法将在创建bean之后但初始化之前调用.在此自定义的其余模板仅在内部用于执行身份验证。另外,您可以定义自己的UserInfoRestTemplateFactory
@Bean
以完全控制.
要在YAML中设置RSA密钥值,请使用“管道”延续标记将其分成多行(“ |”),并记住缩进密钥值(这是标准的YAML语言功能)。例:
security:
oauth2:
resource:
jwt:
keyValue: |
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC...
-----END PUBLIC KEY-----
客户端 - Client
要在web项目上使用OAyth2
,只需要添加@EnableOAuth2Cilent
,Spring Boot会自动创建OAuth2ProtectedResourceDetails
和OAuth2CilentContext
,这对于创建OAuth2RestOperations
是必须的.Spring并不会自动生成这个类
@Bean
public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext,
OAuth2ProtectedResourceDetails details) {
return new OAuth2RestTemplate(details, oauth2ClientContext);
}
您可能想要添加一个限定符并检查您的配置,因为您的应用程序中可能定义了多个RestTemplate
此配置使用security.oauth2.client。*
作为凭据(与授权服务器中可能使用的凭据相同),但此外,它还需要知道授权服务器中的授权和令牌URI。例如:
application.yml
security:
oauth2:
client:
clientId: bd1c0a783ccdd1c9b9e4
clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
accessTokenUri: https://github.com/login/oauth/access_token
userAuthorizationUri: https://github.com/login/oauth/authorize
clientAuthenticationScheme: form
当您尝试使用OAuth2RestTemplate
时,具有此配置的应用程序将重定向到Github进行授权。如果您已经登录Github,您甚至都不会注意到它已通过身份验证。仅当您的应用程序在端口8080上运行时,这些特定的凭据才有效(在Github或其他提供商中注册您自己的客户端应用,以提高灵活性)
要限制客户端获取访问令牌时要求的范围,可以设置security.oauth2.client.scope(逗号分隔或YAML中的数组).
默认情况下,作用域为空,并且由授权服务器决定默认值,通常取决于它所拥有的客户端注册中的设置.
还有一个security.oauth2.client.client-authentication-scheme
设置,默认设置为“ header”,但您可能需要将其设置为“ form”,如果您的OAuth2提供程序不喜欢标头身份验证,例如Github。实际上,security.oauth2.client。*属性绑定到AuthorizationCodeResourceDetails的实例,因此可以指定其所有属性
在非Web应用程序中,您仍然可以创建OAuth2RestOperations,并且仍将其连接到security.oauth2.client。*
配置中
在这种情况下,这是您要使用的“客户凭证令牌授予”(无需使用@ EnableOAuth2Client
或@ EnableOAuth2Sso
).要阻止定义该基础架构,只需从您的配置中删除security.oauth2.client.client-id(或将其设为空字符串)
单点登录 - Single Sign On
OAuth2客户端可用于从提供者获取用户详细信息(如果可用),然后将其转换为Spring Security的身份验证令牌。上面的资源服务器通过user-info-uri属性支持此操作。这是基于OAuth2的单点登录(SSO)协议的基础,Spring Boot通过提供注释@ EnableOAuth2Sso使其易于参与上面的Github客户端可以通过添加该注释并声明在何处找到该端点(除了上面已经列出的security.oauth2.client。*配置之外),使用Github / user /端点来保护其所有资源并进行身份验证:
application.yml.
security:
oauth2:
...
resource:
userInfoUri: https://api.github.com/user
preferTokenInfo: false
由于默认情况下所有路径都是安全的,因此没有可以显示给未经身份验证的用户并邀请他们登录的“主页”页面(通过访问/ login路径或security.oauth2.sso.login-pat
h指定的路径)
要自定义要保护的访问规则或路径,例如,您可以添加“主页”页面,为了自定义要保护的访问规则或路径,因此您可以添加一个“主页”页面,例如,可以将@ EnableOAuth2Sso
添加到WebSecurityConfigurerAdapter
中,并且注释将对其进行修饰和增强,并添加必要的部分以获取/ login。 例如,在这里,我们仅允许未经授权的访问主页“ /”,并保留其他所有内容的默认设置:
@Configuration
static class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void init(WebSecurity web) {
web.ignoring().antMatchers("/");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**").authorizeRequests().anyRequest().authenticated();
}
}
执行器安全 - Actuator Security
如果还使用了执行器,则会发现:
- The management endpoints are secure even if the application endpoints are insecure.
- Security events are transformed into
AuditEvent
instances and published to theAuditEventRepository
. - The default user will have the
ACTUATOR
role as well as theUSER
role.
可以使用外部属性(management.security。*)修改执行器的安全功能。 要覆盖应用程序访问规则,请添加类型为WebSecurityConfigurerAdapter的@Bean,如果您不想覆盖执行器访问规则,请使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER);如果要覆盖执行器访问规则,请使用@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER) 执行器访问规则。
求求你们给个关注吧~~~~~~,完整版文档公众号回复 ‘spring’ 即可获得