首页 > 代码库 > Spring Security 入门(1-3)Spring Security oauth2.0 指南

Spring Security 入门(1-3)Spring Security oauth2.0 指南

入门

这是支持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存在:http://www.springframework.org/schema/security/spring-security-oauth2.xsd。命令空间是http://www.springframework.org/schema/security/oauth2 

授权服务器配置

请注意,每个客户端可以专门配置权限能够使用某些授权机制grant类型。

@EnableAuthorizationServer 注释用于配置 OAuth 2.0 授权服务器机制,加上任意一个@Beans 去实现 AuthorizationServerConfigurer (这是一个hander适配器实现的空方法)。以下功能委托给由 spring 创造的独立 configurers 而且传递到 AuthorizationServerConfigurer:

  • ClientDetailsServiceConfigurer:这个configurer定义了客户端细节服务。客户详细信息可以被初始化,或者你可以参考现有的商店。

  • AuthorizationServerSecurityConfigurer:在令牌端点上定义了安全约束。

  • AuthorizationServerEndpointsConfigurer:定义了授权和令牌端点和令牌服务

提供端配置中重要的一项是提供给OAuth 客户端的授权码。 OAuth 客户端通过将终端用户导向一个可以输入证书/口令的授权验证页面来获取授权码,然后,将授权码传递给提供端授权服务器,服务器验证后重定向页面。 在 OAuth 2 说明文档中有详细的示例。

 

配置客户端详细步骤

ClientDetailsServiceConfigurer 类(AuthorizationServerConfigurer类中的一个调用类)可以用来定义一个基于内存的或者JDBC的客户端信息服务。 

客户端对象重要的属性有:

  • clientId:(必须)客户端id。

  • secret:(对于可信任的客户端是必须的)客户端的私密信息。

  • scope:客户端的作用域。如果scope未定义或者为空(默认值),则客户端作用域不受限制。

  • authorizedGrantTypes:授权给客户端使用的权限类型。默认值为空。

  • authorities:授权给客户端的权限(Spring普通的安全权限)。

在运行的应用中,可以通过直接访问隐藏的存储文件(如:JdbcClientDetailsService中用到的数据库表)或者通过实现ClientDetailsManager 接口(也可以实现ClientDetailsService 接口,或者实现两个接口)来更新客户端信息。

管理令牌

AuthorizationServerTokenServices 接口里定义了 OAuth 2.0 令牌的操作方法。 注意以下几点:

  • 创建一个访问令牌时,必须保存权限信息,这样后续令牌才可以引用它。

  • 访问令牌用于加载创建令牌时的授权信息。

创建AuthorizationServerTokenServices 接口的实现类时,你可以考虑使用DefaultTokenServices 类,它使用随机值创建令牌,并处理除永久令牌以外的所有令牌,对于永久令牌,它委托TokenStore类进行处理。 令牌默认采用基于内存实现的存储方式,但也有一些其它的存储方式。 下面是其中一些方式的简介: 

  • 默认的InMemoryTokenStore 处理类对于单服务器场景非常适用(优点有:低阻塞,宕机时无需热切换到备份服务器)。大部分项目可以在开始时或者在开发模式下使用这种方式,这样比较容易启动一个没有其它依赖的服务器。

  • JdbcTokenStore 类是实现存储令牌的JDBC 版本,它将令牌信息保存到关系型数据库中。 如果服务器间共享数据库或者同一个服务器有多个实例或者授权服务器、资源服务器有多个组件,那么可以使用JDBC方式存储令牌。 使用JdbcTokenStore 类时,需要将spring-jdbc组件jar包添加到工程的编译路径中。

  • JSON网页令牌(JWT)可以加密所有令牌授权访问的数据(因此不需要在后台存储数据,这就是JWT一个重要的优点)。 缺点是你不能方便地撤销一个已授权的令牌(因此一般它们被授权的有效期较短,撤销授权的操作在刷新令牌中进行)。 另一个缺点是存储的令牌数据会越来越大因为在令牌里面存储了大量的用户证书信息。 JwtTokenStore 类不是一个真正的存储类,它未持久化(保存)任何数据,但是它在传输令牌信息和授权信息(在DefaultTokenServices类中实现)中扮演了同样的角色。 JwtTokenStore(接口)类依赖JwtAccessTokenConverter类,授权服务器和资源服务器都需要接口的实现类(因此他们可以安全地使用相同的数据并进行解码)。 令牌以默认方式进行签名,资源服务器为了能够验证这些签名,它需要有与授权服务器相同的对称密钥(服务器共享对称密钥),或者它需要有可以匹配签名私钥的公钥(公有私有密钥或混合密钥)。 为了使用JwtTokenStore 类,你需要在工程编译路径下添加spring-security-jwt组件jar包(你可以在Spring OAuth的github资源库中找到,但是两者的版本号是不一致的)。

Grant 类型

AuthorizationEndpoint 通过 AuthorizationServerEndpointsConfigurer 可以配置支持 Grant 类型。默认情况下支持所有的 grant 类型,除了密码(有关详细信息,请参阅下面的信息如何开启和关闭)。以下属性影响grant类型:
    ? authenticationManager:密码授予被注入一个authenticationManager开启。
    ? authorizationCodeServices:为了身份验证代码授予定义了授权代码服务(org.springframework.security.oauth2.provider.code.AuthorizationCodeServices实例).
    ? implicitGrantService:在隐式授予管理状态。
    ? tokenGranter:TokenGranter(完全掌控的授予和忽略上面的其他属性)?在XML grant类型包括authorization-server的子元素。

配置端点的URL

AuthorizationServerEndpointsConfigurer有一个pathMapping()方法。该方法有两个参数:

  • defaultPath 默认的端点URL

  • customPath 自定义的URL 

框架自己提供的URL路径是/oauth/authorize(授权端),/oauth/token (令牌端),/oauth/confirm_access (用户发送确认授权到这里),还有/oauth/error (用户呈现授权服务器授权出错的请求)。

注意:授权端/oauth/authorize(或者是它的影射)应该是受Spring Security保护的,所以它只能被已授权的用户访问。令牌端默认是通过使用支持使用HTTP基本身份验证客户机的秘密的注解@Configuration,被Spring Oauth保护的,但不是使用XML文件的(所以在这种情况下它被保护是很明确的)。

使用XML的<authorization-server/>元素可以使用一些属性来达到改变默认的端点URL。

自定义错误处理

授权服务器上错误处理使用标准的 Spring MVC 功能,即 @ExceptionHandler 端点本身的方法。用户还可以提供一个 WebResponseExceptionTranslator 端点本身,最好的办法是改变响应的内容而不是他们呈现的方式。异常的呈现代表 HttpMesssageConverters (这个可以添加到MVC的配置中)令牌的端点和OAuth的错误视图(/ OAuth /error)的授权端点。提供一个whitelabel错误端点,但是用户可能需要提供一个自定义的实现(例如,就添加一个 @Controller,它的请求映射是 @RequestMapping(“/ oauth /error”))。

配置资源服务器

资源服务器(可能和授权服务器或者一个单独的应用程序在同一台主机上)提供被OAuth2 令牌保护的资源。 Spring OAuth提供一个Spring Security授权过滤器,它实现保护资源的功能。在@Configuration类中,你可以使用@EnableResourceServer来开启/关闭过滤器,使用ResourceServerConfigurer来配置它。 下面是可配置的属性:

  • tokenServices:定义令牌服务的实体(ResourceServerTokenServices类的实例)。

  • resourceId:资源ID(可选的,建议配置,如果不为空,授权服务器会对它进行验证)。

@EnableResourceServer注解把一个 OAuth2AuthenticationProcessingFilter 类型过滤器添加到Spring Security 过滤链中。

在 XML中,有一个<resource-server/>元素,它有一个id属性 – 这是servlet过滤器的bean id,它过滤哪些可以被添加到Spring Security链中。

Spring Security 入门(1-3)Spring Security oauth2.0 指南