本文翻译自 https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle/
注:个人水平有限,部分翻译可能不到位,欢迎指正!
28. 安全
@EnableGlobalMethodSecurity
附加你想要的设置。更多信息请查阅 Spring Security Reference。
AuthenticationManager
)有一个单一的用户(用户名和随机密码会在应用启动时打印在INFO级消息中)。
Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
如果你需细化你的日志配置,确保 |
security.user.password
来改变密码。这个或其他有用的属性通过 SecurityProperties
(属性前缀为“security”)来给出。
SecurityAutoConfiguration
和引入她的类中实现(SpringBootWebSecurityConfiguration
实现了web安全而AuthenticationManagerConfiguration
则实现认证配置也可用在非web应用中)。要完全关闭默认的web应用安全配置,你需要增加一个带有 @EnableWebSecurity
的bean(这不会禁用认证管理配置和执行器的安全)。定制安全配置你通常需要额外的属性和 WebSecurityConfigurerAdapter
类型的bean(即增加 基于form的登录)。
如果你增加 |
AuthenticationManager
类的bean,也可以通过在你 @Configuration
类下的一个方法中通过 AuthenticationManagerBuilder
自动注入配置一个全局的AuthenticationManager
。这有一些安全应用在Spring Boot 样例中可以让你了解大多数使用场景。
- 一个内存存储的
AuthenticationManager
bean 和一个单一用户(看SecurityProperties.User
给用户设置的属性)。 - 忽略常见静态资源位置路径(
/css/**
,/js/**
,/images/**
,/webjars/**
and**/favicon.ico
)(不安全)。 - 所有其他端点的HTTP基本安全。
- 发布到Spring的
ApplicationEventPublisher
中的安全事件(认证成功和失败及访问禁止)。 - 由Spring Security提供的基本低级特性(HSTS,XSS,CSRF,缓存)默认开启。
security.*
)。为了在不改变任何自动配置特点的情况下重写访问规则,你需要增加一个WebSecurityConfigurerAdapter
类型的bean用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
注解并配置来满足你的需求。
通常 |
28.1 OAuth2
spring-security-oauth2
你可以获得一些更高级的自动配置来方便设置认证或资源服务。更多细节,参考 Spring Security OAuth 2 开发手册。
28.1.1 认证服务器
@EnableAuthorizationServer
并且提供 security.oauth2.client.client-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”和一个随机密码)。
AuthorizationServerConfigurer
类型的 @Bean
。
28.1.2 资源服务器
@EnableResourceServer
并提供一些配置让服务器来解码访问令牌。如果你的应用同时也是一个认证服务器,她已经知道如何来解码访问令牌,所以需要做任何事情。但如果你的应用在一个单独的服务器那么你需要提供一些配置,其中一些如下:
security.oauth2.resource.user-info-uri
用来使用/me
下的资源(例如 Pivotal Web Services(PWS)上的https://uaa.run.pivotal.io/userinfo
)security.oauth2.resource.token-info-uri
用来使用token解码终端(例如PWS上的https://uaa.run.pivotal.io/check_token
)
user-info-uri
和 token-info-uri
那么你需要设置一个标志来标识其中一个优先于另一个(默认prefer-token-info=true
)
user-info-uri
或 token-info-uri
)是如果令牌是JWTs(JSON Web Token) 你可以配置一个 security.oauth2.resource.jwt.key-value
来在本地解码(密钥是一个验证密钥)。验证密钥既可以是一个对称密钥也可以是一个增强型RSA公钥。如果你没有公共密钥,你可以通过security.oauth2.resource.jwt.key-uri
.提供一个可以下载的URI(为一个带有“value”字段的JSON对象)。例如在PWS:
$ curl https://uaa.run.pivotal.io/token_key {"alg":"SHA256withRSA","value":"-----BEGIN PUBLIC KEY-----\nMIIBI...\n-----END PUBLIC KEY-----\n"}
security.oauth2.resource.jwk.key-set-uri
。例如PWS:
$ curl https://uaa.run.pivotal.io/token_keys {"keys":[{"kid":"key-1","alg":"RS256","value":"-----BEGIN PUBLIC KEY-----\nMIIBI...\n-----END PUBLIC KEY-----\n"]}
同时配置JWT和JWK属性会造成错误。仅需配置他们 |
如果你使用 |
security.oauth2.resource.filter-order
规定的拦截器链保护,通常在默认的保护执行器的拦截器之后(所以除非你更改了顺序,否则执行器端点将停留在HTTP基础层面)。
28.2 用户信息中的Token类型
security.oauth2.resource.token-type
。
28.3 定义用户信息REST模板
user-info-uri
,资源服务器会使用内部的OAuth2RestTemplate
去获得认证用户详情。这里提供一个UserInfoRestTemplateFactory
类型的 @Bean
。默认适合绝大多数的供应商,除了偶尔你需要增加额外的拦截器,或改变请求认证(这就是为什么token被附加到输出请求上)。增加自定义仅需创建一个UserInfoRestTemplateCustomizer
类型的bean--她仅有一个唯一的会在这个bean创建时初始化之前被调用的方法。这个只用在内部去执行认证的REST 模板就定义在这个方法中。或者定义你自己的UserInfoRestTemplateFactory
@Bean
获得完全控制。
在YAML中设置RSA密钥值,使用管道结构符号(“|”)来划分多行且记得键值的缩减(这是YAML语言的特性)例如: security:
oauth2:
resource:
jwt:
keyValue: |
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC...
-----END PUBLIC KEY----- |
28.3.1 客户端
@EnableOAuth2Client
,Spring Boot会创建一个 OAuth2ClientContext
和对于生成 OAuth2RestOperations
必须的 OAuth2ProtectedResourceDetails
。Spring Boot不会自动创建这个bean因为你可以很容易的创建自己的:
@Bean public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) { return new OAuth2RestTemplate(details, oauth2ClientContext); }
你需要增加一个限定符并且检查你的配置是否在你的应用中定义了多个 |
security.oauth2.client.*
配置作为证书(你同样可用在认证服务器上),但除此之外,她需要知道认证服务器的认证和token URIs。例如:
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或者其他更合适的平台注册你的客户端app)。
security.oauth2.client.scope
(在YAML中以逗号分隔,或定义成数组)。默认的范围值为空,她会在到达认证服务器时决定默认值为什么,这取决于他获取的客户端认证配置值。
|
在非web应用中你仍可创建一个 |
28.3.2 单点登录
Authentication
token。上述资源服务器通过 user-info-uri
属性提供此支持。这是基于OAuth2协议的单点登录(Single Sign On(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-path
指定的路径)。
@EnableOAuth2Sso
可以增加到 WebSecurityConfigurerAdapter
上,注解会造成后者被装饰并且需要必要的代码片段来使/login
路径有效。例如,下面的例子我们简单允许未授权用户可以访问“/”下的home页,但是保持其他默认:
@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(); } }
28.4 Actuator 安全
- 管理端是安全的即使应用端不安全。
- 安全事件被传到
AuditEvent
实例并且发布到AuditEventRepository
。 - 默认的用户将像
USER
角色一样拥有ACTUATOR
角色。
management.security.*
)修改。要重写应用访问规则,增加一个WebSecurityConfigurerAdapter
类型的bean和@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
(如果你不想重写Actuator访问规则),或者@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)
(如果你要重写Actuator访问规则)。