《Spring Boot官方指南》28.3 -28.4

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)’注解。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/114010.html

(0)
上一篇 2021年8月27日
下一篇 2021年8月27日

相关推荐

发表回复

登录后才能评论