SpringBootSecurity中OAuth2.0简单示例是怎样的

SpringBootSecurity中OAuth2.0简单示例是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

OAuth3.0

OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。客户端来申请资源,资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。也就是说,OAuth 的核心就是向第三方应用颁发令牌。而且,OAuth 2.0 规定了四种获得令牌的流程。你可以选择最适合自己的那一种,向第三方应用颁发令牌。

下面我们来使用spring cloud security 和 spring cloud oauth3两个组件来简单实现授权流程。

授权服务

下面我们来使用spring cloud security 实现一个授权服务,首先来引入依赖:

SpringBootSecurity中OAuth2.0简单示例是怎样的

除了一个web组件,只引入了一个spring-cloud-starter-oauth3,这是因为spring cloud下的oauth3组件已经包含了security:

SpringBootSecurity中OAuth2.0简单示例是怎样的

首先写一个正常的登录功能,application配置文件和启动类都不用增加特殊配置,主要来配置security配置类:

SpringBootSecurity中OAuth2.0简单示例是怎样的

这里面基本没有特殊的配置,都是前面遇到过的熟悉的配置。有了这个配置类,基本的登录功能就有了,要想有授权功能,还需要一个授权配置类,授权配置类需要继承 AuthorizationServerConfigurerAdapter 类,并引入 @EnableAuthorizationServer 注解:

SpringBootSecurity中OAuth2.0简单示例是怎样的

首先配置一个客户端:

SpringBootSecurity中OAuth2.0简单示例是怎样的

然后配置token的存储和管理,此处使用secret作为秘钥,后面会介绍使用非对称加密的方式 :

SpringBootSecurity中OAuth2.0简单示例是怎样的

上面的token存储在了内存中,token也可以存储在数据库或者redis中。最后配置授权端点的访问控制:

SpringBootSecurity中OAuth2.0简单示例是怎样的

以上就是一个简答的授权服务。

资源服务

下面来搭建一个资源服务,其实授权和资源服务是可以合二为一的,此处为了清晰,将它们分开。pom中引入的依赖和授权服务是一样的,同样,配置文件和启动类不需要做特殊配置。首先来写两个简单的接口,一个定义为受保护,另一个不受保护:

SpringBootSecurity中OAuth2.0简单示例是怎样的

然后定义一个资源服务配置类,需要继承 ResourceServerConfigurerAdapter 类,并引入 @EnableResourceServer 注解:

SpringBootSecurity中OAuth2.0简单示例是怎样的

首先来看令牌验证的配置:

SpringBootSecurity中OAuth2.0简单示例是怎样的

然后来看接口资源的拦截规则:

SpringBootSecurity中OAuth2.0简单示例是怎样的

save开头的可以直接访问,不会被拦截,/user/save接口会被验证。

注意上面配置的clientId和secret都是单一的配置死的,如果需要对多客户端动态进行认真,需要重写,后面是通过http调用的方式解析访问令牌(主要是通过访问授权服务的/oauth/check_token解析)。

测试

我们来根据前面说到的流程测试,首先向授权服务申请一个授权码:

  • http://localhost:8015/oauth/authorize?client_id=clientId&response_type=code&redirect_uri=http://localhost:8015/

访问首先会跳转到登录页面:

SpringBootSecurity中OAuth2.0简单示例是怎样的

SpringBootSecurity中OAuth2.0简单示例是怎样的