这是支持OAuth2.0的用户指南。对于OAuth1.0,一切都是不同的,所以看它的用户指南。
本用户指南分为两个部分,第一部分是OAuth2.0提供端(OAuth 2.0 Provider),第二部分是OAuth2.0的客户端(OAuth 2.0 Client)
OAuth2.0提供端OAuth2.0的提供端的用途是负责将受保护的资源暴露出去。配置包括建立一个可以访问受保护的资源的客户端代表。提供端是通过管理和验证可用于访问受保护的资源的OAuth 2令牌来做的。在适当的地方,提供端也必须为用户提供一个用于确认客户端 是否能够访问受保护的资源的接口(也就是一个页面或是一个窗口)。
在 OAuth 2 提供者其实是分成授权服务和资源服务两个角色的,而这两个角色有时是存在于同一个应用程序中的,通过 Spring Security OAuth 你可以有选择的将它们分裂到两个应用程序中,也可以有选择的给授权服务配置多个资源服务。获取令牌(Tokens)的请求是由Spring MVC的控制器端点来处理的,访问受保护的资源是通过标准的Spring Security请求过滤器来处理的。
下面列举的端点是 Spring Security 过滤器链实现 OAuth 2 授权服务器必须的端点:
AuthorizationEndpoint 是用于授权服务请求的。默认的URL是:/oauth/authrize。
TokenEndpoint 是用于获取访问令牌(Access Tokens)的请求。默认的URL是:/oauth/token。
下面过滤器是实现一个OAuth2资源服务器所必须的:
OAuth2AuthenticationProcessingFilter 这个过滤器是用于加载请求提供的一个授权了的访问令牌是否有效。
对于所有的OAuth 2.0的提供端,通过使用Spring OAuth专门的@Configuration适配器来简化配置。也可以通过XML命名空间来配置OAuth,XML的schema存在:。命令空间是
Spring Security 学习之HTTP基本认证和HTTP摘要认证
授权服务器配置配置授权服务器时,您必须考虑的grant类型,从终端用户那,客户端会使用获取到的访问令牌(如授权代码、用户凭证、刷新令牌)。服务器的配置是用于提供一些实现,像客户端细节服务和令牌服务还有启用或禁用某些方面的全球机制。但是请注意,每个客户端可以专门配置权限能够使用某些授权机制和访问授权。即仅仅因为您的提供者配置为支持“客户证书”grant类型,并不意味着一个特定的客户端被授权使用grant类型。
@EnableAuthorizationServer 注释用于配置 OAuth 2.0 授权服务器机制,加上任意一个@Beans 去实现 AuthorizationServerConfigurer (这是一个hander适配器实现的空方法)。以下功能委托给由 spring 创造的独立 configurers 而且传递到 AuthorizationServerConfigurer:
ClientDetailsServiceConfigurer:这个configurer定义了客户端细节服务。客户详细信息可以被初始化,或者你可以参考现有的商店。
AuthorizationServerSecurityConfigurer:在令牌端点上定义了安全约束。
AuthorizationServerEndpointsConfigurer:定义了授权和令牌端点和令牌服务
提供端配置中重要的一项是提供给OAuth 客户端的授权码。 OAuth 客户端通过将终端用户导向一个可以输入证书/口令的授权验证页面来获取授权码,然后,将授权码传递给提供端授权服务器,服务器验证后重定向页面。 在 OAuth 2 说明文档中有详细的示例。
在 xml 配置文件中,可以使用<authorization-server/>节点配置 OAuth 2.0 授权服务器。
配置客户端详细步骤ClientDetailsServiceConfigurer 类(AuthorizationServerConfigurer类中的一个调用类)可以用来定义一个基于内存的或者JDBC的客户端信息服务。
客户端对象重要的属性有:
clientId:(必须)客户端id。
secret:(对于可信任的客户端是必须的)客户端的私密信息。
scope:客户端的作用域。如果scope未定义或者为空(默认值),则客户端作用域不受限制。
authorizedGrantTypes:授权给客户端使用的权限类型。默认值为空。
authorities:授权给客户端的权限(Spring普通的安全权限)。
在运行的应用中,可以通过直接访问隐藏的存储文件(如:JdbcClientDetailsService中用到的数据库表)或者通过实现ClientDetailsManager 接口(也可以实现ClientDetailsService 接口,或者实现两个接口)来更新客户端信息。
管理令牌
AuthorizationServerTokenServices 接口里定义了 OAuth 2.0 令牌的操作方法。 注意以下几点:
创建一个访问令牌时,必须保存权限信息,这样后续令牌才可以引用它。
访问令牌用于加载创建令牌时的授权信息。
创建AuthorizationServerTokenServices 接口的实现类时,你可以考虑使用DefaultTokenServices 类,它使用随机值创建令牌,并处理除永久令牌以外的所有令牌,对于永久令牌,它委托TokenStore类进行处理。 令牌默认采用基于内存实现的存储方式,但也有一些其它的存储方式。 下面是其中一些方式的简介:
Grant 类型AuthorizationEndpoint 通过 AuthorizationServerEndpointsConfigurer 可以配置支持 Grant 类型。默认情况下支持所有的 grant 类型,除了密码(有关详细信息,请参阅下面的信息如何开启和关闭)。以下属性影响grant类型:
• authenticationManager:密码授予被注入一个authenticationManager开启。
• authorizationCodeServices:为了身份验证代码授予定义了授权代码服务(org.springframework.security.oauth2.provider.code.AuthorizationCodeServices实例).
• implicitGrantService:在隐式授予管理状态。
• tokenGranter:TokenGranter(完全掌控的授予和忽略上面的其他属性)
在XML grant类型包括authorization-server的子元素。