SpringBootSecurity学习(15)先后端分离版之 OAuth2.0简单示例

OAuth2.0

OAuth 引入了一个受权层,用来分离两种不一样的角色:客户端和资源全部者。客户端来申请资源,资源全部者赞成之后,资源服务器能够向客户端颁发令牌。客户端经过令牌,去请求数据。也就是说,OAuth 的核心就是向第三方应用颁发令牌。并且,OAuth 2.0 规定了四种得到令牌的流程。你能够选择最适合本身的那一种,向第三方应用颁发令牌。html

具体的OAuth学习建议仔细研读阮一峰的教程,git

  • http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

下面咱们来使用spring cloud security 和 spring cloud oauth2两个组件来简单实现受权流程。web

受权服务

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

file

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

file

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

file

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

file

首先配置一个客户端:app

file

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

file

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

file

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

资源服务

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

file

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

file

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

file

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

file

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/

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

file

输入配置中默认的用户名密码登陆,而后进入下一个页面:

file

这个页面是真正的受权页面,选择Approve,点击按钮,赞成受权,受权码会经过回调地址获取,以下图:

file

而后携带受权码申请访问令牌,须要访问下面的地址(须要使用post方式):

  • http://localhost:8015/oauth/token?grant_type=authorization_code&code=受权码&redirect_uri=http://localhost:8015/&client_id=clientId&client_secret=secret

将受权码替换上面地址中的受权码三个字,而后在postman中访问:

file

其返回结果中,包含access_token参数,就是咱们须要的访问令牌,token_type 参数说明了令牌的类型,通常类型为bearer或者refresh_token能够在访问令牌过时后向受权服务申请新的令牌,expires_in参数是令牌的有效时间,单位是秒,图中显示默认是12个小时。令牌已经获得了,下面来访问资源接口,首先试一下不受保护的资源:

file

能够看到直接就能访问,而后访问受保护的资源接口:

file

获得这样的结果说明该接口须要认证,咱们来使用咱们前面获得的令牌来访问,首先选择正确的认真协议:

file

而后在右侧填写前面获取的access_token:

file

而后访问接口,就能看到受保护的资源经过令牌能够访问:

file

代码地址 : https://gitee.com/blueses/spring-boot-security 15 和 16