28.3 User Info RestTemplate的自定义
如果您有一个’user-info-uri’,资源服务器在内部使用’OAuth2RestTemplate’功能来获取用户的身份验证信息。这将提供一个带有’userInfoRestTemplate’主键的’@Bean’,你使用它的时候不需要知道这些。大多数提供程序使用默认就够了,但偶尔你可能需要添加额外的拦截器,或者更改请求验证器(来获取附加在传出请求种令牌)。要添加自定义只需创建一个类型为’UserInfoRestTemplateCustomizer’的bean,它有一个方法,将在bean创建后初始化之前调用。此处定制的rest template仅用于内部身份验证。
Tip | |
---|---|
要在YAML中设置RSA键值,使用’pipe’连续标记将其分隔为多行(’|’),并记住缩进键值(它是一个标准的YAML语言特性)。 例如:
security: oauth2: resource: jwt: keyValue: | -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC... -----END PUBLIC KEY----- |
28.3.1 Client
要将您的web应用变成OAuth2客户端,您只需添加“@ EnableOAuth2Client”注解,Spring Boot将自动创建“OAuth2RestOperations”所需的“OAuth2ClientContext”和“OAuth2ProtectedResourceDetails”。 Spring Boot不会自动创建这样的bean,但你可以轻松地创建自有的:
@Bean public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) { return new OAuth2RestTemplate(details, oauth2ClientContext); }
Note | |
---|---|
您可能需要添加限定符并检查您的配置,因为你的应用程序中可能定义了多个“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中的数组)。默认情况下范围为空,由授权服务器来决定其默认值,通常取决于该服务器所保留的在客户端注册中的设置。
Note | |
---|---|
同样“security.oauth2.client.client-authentication-scheme”有一个设置默认值为’header’(但你可能需要将其设置为’form’,举个例子,假如Github作为你的OAuth2提供者,它不会喜欢头部认证)。实际上,’security.oauth2.clien.*’属性绑定在’AuthorizationCodeResourceDetails’的实例上,因此可以指定它的所有属性。 |
Tip | |
---|---|
在非Web应用程序中,也可以创建一个“OAuth2RestOperations”,它依旧关联着’security.oauth2.client.*’配置。如果你使用它, 你会要求它是一个’客户端证书令牌授予’(并且不需要使用’@ EnableOAuth2Client’或’@ EnableOAuth2Sso’注解)。要防止基础结构被定义,只需从配置中删除“security.oauth2.client.client-id”(或将其设置为空字符串)。 |
28.3.2 单点登录
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
由于默认情况下所有路径都是安全的,因此没有’home’页面可以提供给未认证的用户来邀请他们登录(通过访问’/ login’路径或’security.oauth2.sso.login指定的路径)。
要自定义要保护的访问规则或路径,您可以添加一个“home”页面,以及添加“@ EnableOAuth2Sso”注解到“WebSecurityConfigurerAdapter”,这将使它通过一些必要的部件来得到增强以使 ‘/ login’ 路径生效。例如,未经身份验证只允许通过“/”访问主页,其他保持默认设置:
@Configuration public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void init(WebSecurity web) { web.ignore("/"); } @Override protected void configure(HttpSecurity http) throws Exception { http.antMatcher("/**").authorizeRequests().anyRequest().authenticated(); } }
28.4 执行器安全
如果使用了执行器,你会发现
- 即使应用程序端点不安全,管理端点也是安全的。
- Security事件将转变成“AuditEvents”并发布到“AuditService”。
- 默认用户将具有“ADMIN”角色以及“USER”角色。
可以使用外部属性(’management.security。*’)来修改执行器安全功能。要覆盖应用程序访问规则,请添加类型为“WebSecurityConfigurerAdapter”的’@Bean’,如果您不想覆盖执行程序访问规则,请使用’@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)’注解,或者如果你想要覆盖执行器访问规则请使用’@Order(ManagementServerProperties. ACCESS_OVERRIDE_ORDER)’注解。