Spring Cloud Security OAuth2授权服务器的搭建

一、环境介绍

Spring Cloud SecurityOAuth2是对Spring SecurityOAuth2协议的一种集成,与Spring Cloud体系的集成也非常便利。

OAuth2.0的服务提供方涵盖两个服务,即授权服务 (Authorization Server认证服务) 和资源服务 (Resource Server)。

授权服务 (Authorization Server)

应包含对接入端以及登入用户的合法性进行验证并颁发token等功能,对令牌 的请求端点由Spring MVC控制器进行实现,下面是配置一个认证服务必须要实现的endpoints

  • AuthorizationEndpoint服务于认证请求,默认URL/oauth/authorize
  • TokenEndpoint服务于访问令牌的请求,默认URL/oauth/token

资源服务 (Resource Server)

应包含对资源的保护功能,对非法请求进行拦截,对请求中token进行解析鉴权等,下面的过滤器用于实现OAuth 2.0资源服务

  • OAuth2AuthenticationProcessingFilter用来对请求给出的身份令牌解析鉴权。

认证流程:
在这里插入图片描述

  1. 客户端请求UAA授权服务进行认证
  2. 认证通过后由UAA颁发令牌
  3. 认证通过后由UAA颁发令牌
  4. 资源服务校验令牌的合法性,合法即返回资源信息

二、授权服务器的搭建

代码和环境搭建忽略,详情见:https://github.com/hucheng1997/security-oauth2

使用@EnableAuthorizationServer注解并继承AuthorizationServerConfigurerAdapter来配置OAuth2.0授权服务器。

AuthorizationServerConfigurerAdapter要求配置以下几个类,这几个类是由Spring创建的独立的配置对象,它们会被Spring传入AuthorizationServerConfigurer中进行配置。

public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer { 
	public AuthorizationServerConfigurerAdapter(){}
	public void configure(AuthorizationServerSecurityConfigurer security){}
	public void configure(ClientDetailsServiceConfigurer clients) {}
	public void configure(AuthorizationServerEndpointsConfigurer endpoints){}
}
  • ClientDetailsServiceConfigurer:用来配置客户端详情服务(ClientDetailsService),客户端详情信息在这里进行初始化,你能够把客户端详情信息写死在这里或者是通过数据库来存储调取详情信息
  • AuthorizationServerEndpointsConfigurer:用来配置令牌(token)的访问端点和令牌服务(token services)
  • AuthorizationServerSecurityConfigurer:用来配置令牌端点的安全约束

2.1配置客户端详细信息ClientDetailsService

ClientDetailsServiceConfigurer能够使用内存或者JDBC来实现客户端详情服务(ClientDetailsService), ClientDetailsService负责查找ClientDetails,而ClientDetails有几个重要的属性如下列表:

  • clientId:(必须的)用来标识客户的Id
  • secret:(需要值得信任的客户端)客户端安全码
  • scope:用来限制客户端的访问范围,如果为空(默认)的话,那么客户端拥有全部的访问范围。
  • authorizedGrantTypes:此客户端可以使用的授权类型,默认为空。
  • authorities:此客户端可以使用的权限(基于Spring Security authorities)。

客户端详情(Client Details)能够在应用程序运行的时候进行更新,可以通过访问底层的存储服务(例如将客户端详情存储在一个关系数据库的表中,就可以使用 JdbcClientDetailsService)或者通过自己实现 ClientRegistrationService接口(同时你也可以实现ClientDetailsService接口)来进行管理。

2.2管理令牌

AuthorizationServerTokenServices接口定义了一些操作使得你可以对令牌进行一些必要的管理,令牌可以被用来加载身份信息,里面包含了这个令牌的相关权限。

自己可以创建AuthorizationServerTokenServices这个接口的实现,则需要继承DefaultTokenServices这个类, 里面包含了一些有用实现,你可以使用它来修改令牌的格式和令牌的存储。默认的,当它尝试创建一个令牌的时候,是使用随机值来进行填充的,除了持久化令牌是委托一个TokenStore接口来实现以外,这个类几乎帮你做了 所有的事情。并且TokenStore这个接口有一个默认的实现,它就是InMemoryTokenStore,如其命名,所有的 令牌是被保存在了内存中。除了使用这个类以外,你还可以使用一些其他的预定义实现,下面有几个版本,它们都实现了TokenStore接口:

  • InMemoryTokenStore:这个版本的实现是被默认采用的,它可以完美的工作在单服务器上(即访问并发量 压力不大的情况下,并且它在失败的时候不会进行备份),大多数的项目都可以使用这个版本的实现来进行尝试,你可以在开发的时候使用它来进行管理,因为不会被保存到磁盘中,所以更易于调试。
  • JdbcTokenStore:这是一个基于JDBC的实现版本,令牌会被保存进关系型数据库。使用这个版本的实现时, 你可以在不同的服务器之间共享令牌信息,使用这个版本的时候请注意添加spring-jdbc依赖。
  • JwtTokenStore:这个版本的全称是JSON Web Token(JWT),它可以把令牌相关的数据进行编码(因此对 于后端服务来说,它不需要进行存储,这将是一个重大优势),但是它有一个缺点,那就是撤销一个已经授权令牌将会非常困难,所以它通常用来处理一个生命周期较短的令牌以及撤销刷新令牌(refresh_token)。 另外一个缺点就是这个令牌占用的空间会比较大,如果你加入了比较多用户凭证信息。JwtTokenStore不会保存任何数据,但是它在转换令牌值以及授权信息方面与DefaultTokenServices所扮演的角色是一样的。

2.3令牌访问端点配置

AuthorizationServerEndpointsConfigurer这个对象的实例可以完成令牌服务以及令牌endpoint配置。

配置授权类型(Grant Types):

AuthorizationServerEndpointsConfigurer通过设定以下属性决定支持的授权类型(Grant Types

  1. authenticationManager:认证管理器,当你选择了资源所有者密码(password)授权类型的时候,请设置这个属性注入一个AuthenticationManager对象。
  2. userDetailsService:如果你设置了这个属性的话,那说明你有一个自己的UserDetailsService接口的实现, 或者你可以把这个东西设置到全局域上面去(例如GlobalAuthenticationManagerConfigurer这个配置对 象),当你设置了这个之后,那么 “refresh_token” 即刷新令牌授权类型模式的流程中就会包含一个检查,用来确保这个账号是否仍然有效,假如说你禁用了这个账户的话。
  3. authorizationCodeServices:这个属性是用来设置授权码服务的(即AuthorizationCodeServices的实例对 象),主要用于 “authorization_code” 授权码类型模式。
  4. implicitGrantService:这个属性用于设置隐式授权模式,用来管理隐式授权模式的状态。
  5. tokenGranter:当你设置了这个东西(即TokenGranter接口实现),那么授权将会交由你来完全掌控,并 且会忽略掉上面的这几个属性,这个属性一般是用作拓展用途的,即标准的四种授权模式已经满足不了你的 需求的时候,才会考虑使用这个。

配置授权端点的URL(Endpoint URLs):

AuthorizationServerEndpointsConfigurer这个配置对象有一个叫做pathMapping()的方法用来配置端点URL链接,它有两个参数:

  • 第一个参数:String类型的,这个端点URL的默认链接
  • 第二个参数:String类型的,你要进行替代的URL链接

以上的参数都将以 “/” 字符为开始的字符串,框架的默认URL链接如下列表,可以作为这个pathMapping()方法的 第一个参数:

  • /oauth/authorize:授权端点
  • /oauth/token:令牌端点
  • /oauth/confirm_access:用户确认授权提交端点
  • /oauth/error:授权服务错误信息端点
    -/oauth/check_token:用于资源服务访问的令牌解析端点
  • /oauth/token_key:提供公有密匙的端点,如果你使用JWT令牌的话

需要注意的是授权端点这个URL应该被Spring Security保护起来只供授权用户访问

2.4令牌端点的安全约束

用来配置令牌端点(Token Endpoint)的安全约束,在AuthorizationServer中配置如下:

@Override
public void configure(AuthorizationServerSecurityConfigurer security){
    security
            .tokenKeyAccess("permitAll()")                    //oauth/token_key是公开
            .checkTokenAccess("permitAll()")                  //oauth/check_token公开
            .allowFormAuthenticationForClients()				//表单认证(申请令牌)
    ;
}
  1. tokenkey这个endpoint当使用JwtToken且使用非对称加密时,资源服务用于获取公钥而开放的,这里指这个 endpoint完全公开
  2. checkToken这个endpoint完全公开
  3. 允许表单认证

2.5授权服务配置总结

授权服务配置分成三大块,可以关联记忆:

①客户端详情配置
②定义token的相关endpoint,以及token如何存取,以及客户端支持哪些类型的token
endpoint可以定义一些安全上的约束等

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HuCheng1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值