当前位置:首页 > 后端开发 > SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例

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

6个月前 (05-24)47

OAuth2.0

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

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

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

授权服务

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

首先配置一个客户端:

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

资源服务

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

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

测试

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

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

这个页面是真正的授权页面,选择Approve,点击按钮,同意授权,授权码会通过回调地址获取,如下图:

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

可以看到直接就能访问,然后访问受保护的资源接口:

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

然后访问接口,就能看到受保护的资源通过令牌可以访问:

SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例 _ Java侠

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

作者:程序员郭艺宾
来源链接:https://www.cnblogs.com/guos/p/11632713.html

标签: OAuth2

“SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例” 的相关文章

Spring Security OAuth2 Demo —— 客户端模式(ClientCredentials)

Spring Security OAuth2 Demo —— 客户端模式(ClientCredentials)

前情回顾 前几节分享了OAuth2的流程与其它三种授权模式,这几种授权模式复杂程度由大至小:授权码模式 > 隐式授权模式 > 密码模式 > 客户端模式 本文...

《微信开发日志》之OAuth2验证接口

《微信开发日志》之OAuth2验证接口

OAuth2接口说明: 企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0验证接口来获取员工的身份信息。   通过此接口获取用...

关于OAuth2 Scope的理解

关于OAuth2 Scope的理解

按照官网的解释,Scope是资源拥有者(服务端)用来授予客户端特定权限的一个参数。换句话说,Scope是服务端规定好的,不同的客户端可以申请不同权限的名称。例如服务端规定了客户...

Secure REST API with oauth2 (翻译)

http://blog.csdn.net/haiyan_qi/article/details/52384734 **********************************...

使用SpringSecurity Oauth2.0实现自定义鉴权中心

使用SpringSecurity Oauth2.0实现自定义鉴权中心

Oauth2.0是什么不在赘述,本文主要介绍如何使用SpringSecurity Oauth2.0实现自定义的用户校验 1.鉴权中心服务 首先,列举一下我们需要用到的依赖,本...

[原创]Oauth2.0实现SSO单点登录的CAS方式和相关Demo演示

[原创]Oauth2.0实现SSO单点登录的CAS方式和相关Demo演示

SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以...

Spring-Security-OAuth2微信网页授权

p.p1 { margin: 0; font: 11px Monaco; color: rgba(119, 119, 119, 1) } p.p2 { margin: 0; font:...

oauth2 server php

https://github.com/bshaffer/oauth2-server-php http://bshaffer.github.io/oauth2-server-php-d...

Spring Cloud(6.1):搭建OAuth2 Authorization Server

配置web.xml 添加spring-cloud-starter-security和spring-security-oauth2-autoconfigure两个依赖。...