SpringBoot 中文手册 --Part IV --28 安全

xiaoxiao2021-02-28  14

本文翻译自 https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle/  

注:个人水平有限,部分翻译可能不到位,欢迎指正!

28. 安全

如果在classpath上存在Spring Security,那么web应用会默认在所有HTTP访问上使用基本认证来保护应用安全。如需增加应用方法级安全,你可以通过增加 @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 和引入她的类中实现(SpringBootWebSecurityConfiguration 实现了web安全而AuthenticationManagerConfiguration 则实现认证配置也可用在非web应用中)。要完全关闭默认的web应用安全配置,你需要增加一个带有 @EnableWebSecurity 的bean(这不会禁用认证管理配置和执行器的安全)。定制安全配置你通常需要额外的属性和 WebSecurityConfigurerAdapter 类型的bean(即增加 基于form的登录)。

如果你增加 @EnableWebSecurity 的同时也关闭了执行器安全,除非你增加自定义的WebSecurityConfigurerAdapter否则你需要为整个应用添加默认的登录表单。

如果也需关掉认真管理配置,你可以增加一个AuthenticationManager类的bean,也可以通过在你 @Configuration 类下的一个方法中通过 AuthenticationManagerBuilder 自动注入配置一个全局的AuthenticationManager。这有一些安全应用在Spring Boot 样例中可以让你了解大多数使用场景。 在web应用中可以获得良好支持的基本特性:   一个内存存储的 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) 注解并配置来满足你的需求。

通常 WebSecurityConfigurerAdapter 会匹配所有路径,如果你不下那个全部重写Spring Boot自动配置的访问规则,你的适配器必须额外配置你想重写的路径。

28.1 OAuth2

如果你的classpath上有 spring-security-oauth2 你可以获得一些更高级的自动配置来方便设置认证或资源服务。更多细节,参考 Spring Security OAuth 2 开发手册。

28.1.1 认证服务器

为了创建一个认证服务进行访问tokens授权,你需要使用@EnableAuthorizationServer 并且提供 security.oauth2.client.client-id 和security.oauth2.client.client-secret 属性。客户端将在内存存储中为你注册。 昨晚上述工作你就可以使用认证的客户端来创建访问token,例如 $ 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"} 此外,你的认证服务器需要返回一个JSON Web Keys(JWKs),你需要配置 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.jwt.key-uri (或security.oauth2.resource.jwt.key-value) 和security.oauth2.resource.jwk.key-set-uri 中的一个。

如果你使用 security.oauth2.resource.jwt.key-uri 或security.oauth2.resource.jwk.key-set-uri   认证服务器需要在你的应用启动时处于运行状态。这样她会记录未发现密钥的警告,并告诉你如何修复。

OAuth2 资源被一个 security.oauth2.resource.filter-order  规定的拦截器链保护,通常在默认的保护执行器的拦截器之后(所以除非你更改了顺序,否则执行器端点将停留在HTTP基础层面)。

28.2 用户信息中的Token类型

谷歌,和其他一些第三方认证提供者对于在头部中发给用户信息端的token类型名是十分严格的。通常适合大多数提供者去匹配细项的类型名是“Bearer”,但如果你想更改她,你可以设置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 客户端

要使你的web-app成为OAuth2 客户端,你需要简单的增加 @EnableOAuth2Client ,Spring Boot会创建一个 OAuth2ClientContext 和对于生成 OAuth2RestOperations 必须的  OAuth2ProtectedResourceDetails 。Spring Boot不会自动创建这个bean因为你可以很容易的创建自己的: @Bean public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) { return new OAuth2RestTemplate(details, oauth2ClientContext); }

你需要增加一个限定符并且检查你的配置是否在你的应用中定义了多个RestTemplate 

使用 security.oauth2.client.* 配置作为证书(你同样可用在认证服务器上),但除此之外,她需要知道认证服务器的认证和token URIs。例如: 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或者其他更合适的平台注册你的客户端app)。 要限制客户端在获取一个访问token的请求范围,你可以设置security.oauth2.client.scope (在YAML中以逗号分隔,或定义成数组)。默认的范围值为空,她会在到达认证服务器时决定默认值为什么,这取决于他获取的客户端认证配置值。

security.oauth2.client.client-authentication-scheme 也是一个设置项,默认值 为“header”(但你可能想设置她为“form”, 像GitHub的实例, 你的OAuth2 提供者不喜欢header认证方式). 事实上security.oauth2.client.* 属性被绑定到 AuthorizationCodeResourceDetails 的实例以便所有的属性可以被指定

在非web应用中你仍可创建一个 OAuth2RestOperations ,它仍然会被连接到 security.oauth2.client.* 配置。 这种情况下,如果你使用它,它将是一个“获得token证书的客户端”(这时不需要使用 @EnableOAuth2Client 或 @EnableOAuth2Sso). 要防止基础结构被定义,仅需从你的配置中移除 security.oauth2.client.client-id  (或者赋空值)。

28.3.2 单点登录

一个OAuth2 客户端可用于从提供者那获取用户详细信息(如果支持此特性)然后把他们转换成一个Spring Security  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 由于所有的路径默认被保护,所以没有“home”页展示给未授权的用户,而是邀请他们去登录(通过访问 /login 路径,或者被security.oauth2.sso.login-path指定的路径)。 要自定义访问规则或保护的路径,以便你可以给实例增加“home”页,@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 安全

如果同时使用Actuator,你会发现: 管理端是安全的即使应用端不安全。安全事件被传到 AuditEvent 实例并且发布到AuditEventRepository默认的用户将像 USER 角色一样拥有 ACTUATOR 角色。 Actuator 安全特性可以使用外部的属性(management.security.* )修改。要重写应用访问规则,增加一个WebSecurityConfigurerAdapter 类型的bean和@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) (如果你不想重写Actuator访问规则),或者@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER) (如果你要重写Actuator访问规则)。
转载请注明原文地址: https://www.6miu.com/read-2149991.html

最新回复(0)