简介

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文重点讲解Spring Boot项目对OAuth2进行的实现,如果你对OAuth2不是很了解,你可以先理解 OAuth 2.0 - 阮一峰,这是一篇对于oauth2很好的科普文章。

OAuth2概述

oauth2根据使用场景不同,分成了4种模式

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

在项目中我们通常使用授权码模式,也是四种模式中最复杂的,通常网站中经常出现的微博,qq第三方登录,都会采用这个形式。

Oauth2授权主要由两部分组成:

  • Authorization server:认证服务
  • Resource server:资源服务

在实际项目中以上两个服务可以在一个服务器上,也可以分开部署。下面结合spring boot来说明如何使用。

快速上手

之前的文章已经对 Spring Security 进行了讲解,这一节对涉及到 Spring Security 的配置不详细讲解。若不了解 Spring Security 先移步到 Spring Boot Security 详解。

建表

客户端信息可以存储在内存、redis和数据库。在实际项目中通常使用redis和数据库存储。本文采用数据库。Spring 0Auth2 己经设计好了数据库的表,且不可变。表及字段说明参照:Oauth2数据库表说明 。

创建0Auth2数据库的脚本如下:

DROP 

为了测试方便,我们先插入一条客户端信息。

INSERT 

用户、权限、角色用到的表如下:

DROP 

项目结构

resources
|____templates
| |____login.html
| |____application.yml
java
|____com
| |____gf
| | |____SpringbootSecurityApplication.java
| | |____config
| | | |____SecurityConfig.java
| | | |____MyFilterSecurityInterceptor.java
| | | |____MyInvocationSecurityMetadataSourceService.java
| | | |____ResourceServerConfig.java
| | | |____WebResponseExceptionTranslateConfig.java
| | | |____AuthorizationServerConfiguration.java
| | | |____MyAccessDecisionManager.java
| | |____entity
| | | |____User.java
| | | |____RolePermisson.java
| | | |____Role.java
| | |____mapper
| | | |____PermissionMapper.java
| | | |____UserMapper.java
| | | |____RoleMapper.java
| | |____controller
| | | |____HelloController.java
| | | |____MainController.java
| | |____service
| | | |____MyUserDetailsService.java

关键代码

pom.xml

<dependency>

SecurityConfig

支持password模式要配置AuthenticationManager

@Configuration

AuthorizationServerConfiguration 认证服务器配置

/**

ResourceServerConfig 资源服务器配置

/**

关键代码就是这些,其他类代码参照后面提供的源码地址。

验证

密码授权模式

[ 密码模式需要参数:username , password , grant_type , client_id , client_secret ]

请求token

curl -X POST -d "username=admin&password=123456&grant_type=password&client_id=dev&client_secret=dev" http://localhost:8080/oauth/token

返回

{

不携带token访问资源,

curl http://localhost:8080/hi?name=zhangsan

返回提示未授权

{

携带token访问资源

curl http://localhost:8080/hi?name=zhangsan&access_token=164471f7-6fc6-4890-b5d2-eb43bda3328a

返回正确

hi , zhangsan

刷新token

curl  -X POST -d 'grant_type=refresh_token&refresh_token=23503bc7-4494-4795-a047-98db75053374&client_id=dev&client_secret=dev' http://localhost:8080/oauth/token

返回

{"access_token": "ef53eb01-eb9b-46d8-bd58-7a0f9f44e30b","token_type": "bearer","refresh_token": "23503bc7-4494-4795-a047-98db75053374","expires_in": 3599,"scope": "app"
}

客户端授权模式

[ 客户端模式需要参数:grant_type , client_id , client_secret ]

请求token

curl -X POST -d "grant_type=client_credentials&client_id=dev&client_secret=dev" http://localhost:8080/oauth/token

返回

{

授权码模式

获取code

浏览器中访问如下地址:

http://localhost:8080/oauth/authorize?response_type=code&client_id=dev&redirect_uri=http://www.baidu.com

跳转到登录页面,输入账号和密码进行认证:

认证后会跳转到授权确认页面(oauth_client_details 表中 “autoapprove” 字段设置为true 时,不会出授权确认页面):

确认后,会跳转到百度,并且地址栏中会带上我们想得到的code参数:

通过code换token

curl -X POST -d "grant_type=authorization_code&code=qS03iu&client_id=dev&client_secret=dev&redirect_uri=http://www.baidu.com" http://localhost:8080/oauth/token

返回

{

参考

https://segmentfault.com/a/1190000012260914

https://stackoverflow.com/questions/28537181/spring-security-oauth2-which-decides-security

源码

https://github.com/gf-huanchupk/SpringBootLearning/tree/master/springboot-security-oauth2

项目服务接口设计_Spring Boot Security 整合 OAuth2 设计安全API接口服务相关推荐

  1. springboot oauth2登录成功处理器_Spring Boot Security 整合 OAuth2 设计安全API接口服务...

    简介 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.本文重点讲解Spring Boot项目对OAuth2进行的实现,如果你对OAut ...

  2. Spring Boot Security 整合 OAuth2 设计安全API接口服务

    OAuth2概述 oauth2根据使用场景不同,分成了4种模式 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner passwor ...

  3. swaggerconfig.java下载_Spring Boot:整合Swagger文档

    综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于 ...

  4. 整合swagger2生成Restful Api接口文档

    整合swagger2生成Restful Api接口文档 swagger Restful文档生成工具 2017-9-30 官方地址:https://swagger.io/docs/specificati ...

  5. 京东商品详情APP原数据API接口-(item_get_app-获得JD商品详情原数据API接口),京东API接口

    一.京东商品详情APP原数据API接口-(item_get_app-获得JD商品详情原数据API接口),京东API接口代码如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用k ...

  6. asp.mvc 4项目发布文件目录结构_Spring Boot项目搭建与启动

    Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...

  7. java的定时器不能提供实时保证_Spring Boot 2 整合 QuartJob 实现定时器实时管理功能...

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  8. java只允许一个用户登陆_spring boot security只允许一个用户(test1)登录

    我使用spring boot security编写了登录功能 . 这是SecurityConfig类中的configureGlobal方法,扩展了WebSecurityConfigurerAdapte ...

  9. java+swagger+侵入_Spring boot+Swagger配置无侵入式Restful接口(二)

    maven依赖自动配置 额,看了前面第一种配置方式,是不是感觉有点麻烦呢?我也觉得,到时候去掉的时候,还需要进行删除配置啊,一大堆,还有可能到时候根本不知道. 所以,我决定自己写个让它自己就可以完成配 ...

最新文章

  1. javascript 模式学习篇---基础
  2. Android的图片缓存ImageCache(转)
  3. 第06课:动手实战基于 ML 的中文短文本分类
  4. 大数据上云第一课:MaxCompute授权和外表操作躲坑指南
  5. python之cookbook-day03
  6. OpenShift - 部署MySQL主从复制
  7. bzoj千题计划141:bzoj3532: [Sdoi2014]Lis
  8. sax解析xml案例一
  9. JavaScript综述
  10. 神经网络物联网未来发展趋势怎么样
  11. 关闭windows defender教程
  12. 给树莓派刷入OpenWrt
  13. 51单片机堆栈深入剖析(转)
  14. mysql保存微信昵称特殊字符
  15. python脚本计算STM32的bxCAN的波特率
  16. 史上最全搭建MAVEN私服上传并使用JAR包教程
  17. React-从0到1搭建一个React项目(一)
  18. 用计算机弹奏世末歌者,【UTAU用】世末歌者【非官方谱】
  19. DTS 及其在PG 数据库生态中的应用
  20. SINAMICS S120产品入门新手必读

热门文章

  1. Binder内存拷贝的本质和变迁
  2. Android pm命令(持续更新中...)
  3. Android SurfaceFlinger 学习之路(五)----VSync 工作原理
  4. ffmpeg (四):ffmpeg, ffplay, ffprobe用法
  5. WordPress如何开启用户注册功能
  6. android手机慢,Android手机运行慢?!教你一秒“提速”50%
  7. Android Studio实现学生信息管理系统,基础入门项目
  8. 计算机网络考试卷2014B答案,计算机网络考试卷2014B
  9. python 检查域名是否可以访问_糖尿病人是否都要做喝糖水的检查?结果可以说明胰岛功能水平吗?...
  10. Java1009_疯狂java学习笔记1009---异常