前言

上篇文档,我们了解了OAuth2.0的相关知识,接下来我们搭建一个自己的Oauth2开放平台。

从流程图中,可以看到,后台需要搭建一个认证服务器,负责用户登录、第三方授权等功能,还需要搭建自己的资源服务器,也就是我们自己产品的后台。

Security OAuth2 重构说明

官网说明

2019年11月下旬,Spring官方在Spring Security OAuth 2.0路线图中 指出2.3.x版本将在2020年3月到达项目生命周期的终点(End Of Life),随后将会发布2.4.x和2.5.x。 后续2.4.x和2.5.x补丁和安全修复程序支持将持续到2021年5月,另外2.5.x的安全修复支持将持续到2022年5月项目终止日期。相同的寿命终止时间表适用于对应的Spring Boot 2自动配置项目。Spring Security OAuth 2.0会在2022年5月项目终止后开放给Spring社区中的成员直接管理。

spring security 5.0

security 5.0版本,添加了oauth2的相关模块,但是没有授权服务器的相关代码,security最新源码:

各个模块功能如下:

spring cloud 2020

spring cloud 2020发布后,删除了以下模块:

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency>

新的OAuth2.0授权服务器

spring新版本的security去掉了Authorization Server的功能及代码,推荐使用KeyCloak代替。但是社区也引起了很多不满。

后续又继续开发了新的授权服务器,Github地址。但是目前还处于试验阶段,慎用。

最新版本maven坐标:

<!-- https://mvnrepository.com/artifact/org.springframework.security.experimental/spring-security-oauth2-authorization-server -->
<dependency><groupId>org.springframework.security.experimental</groupId><artifactId>spring-security-oauth2-authorization-server</artifactId><version>0.1.2</version>
</dependency>

取舍

经过对新版OAuth2.0授权服务器搭建测试,发现功能并不完善,而且BUG很多,并不能正常使用,所有依然采用spring-security-oauth2。

        <dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-autoconfigure</artifactId></dependency>

JWT

认证服务器认证完成后会发放令牌,客户端携带令牌访问我们的资源服务器。

我们这里采用JWT令牌。用户认证通过会得到一个JWT令牌,JWT令牌中已经包括了用户相关的信 息,客户端只需要携带JWT访问资源服务,资源服务根据事先约定的算法自行完成令牌校验,无需每次都请求认证服务完成授权。

什么是JWT

官网

JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于 在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公 钥/私钥对来签名,防止被篡改。

优点

  • jwt基于json,非常方便解析。
  • 可以在令牌中自定义丰富的内容,易扩展。
  • 通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
  • 资源服务使用JWT可不依赖认证服务即可完成授权。

缺点

  • JWT令牌较长,占存储空间比较大。
  • 长度过大时,消耗网路资源,太长HTTP协议有限制

JWT令牌结构

JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz

每一个子串表示了一个功能块,总共有以下三个部分:JWT 头、有效载荷和签名

典型的,一个 JWT 看起来如下图:

Header

头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)

一个例子如下: 下边是Header部分的内容

 { "alg": "HS256", "typ": "JWT" }

将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。

Payload

第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比 如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。

此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。

最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。

一个例子:

 { "sub": "1234567890", "name": "456", "admin": true }

Signature

第三部分是签名,此部分用于防止jwt内容被篡改。

这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明 签名算法进行签名。

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:签名所使用的密钥

最后说明

以上可知,我们的JWT令牌会存放所有的认证信息,最后使用秘钥签名,最后生成。获取到令牌后访问资源,会使用相同的秘钥检查该令牌,校验通过,资源服务器会保存认证信息,放行请求。

基础工程

1. 创建项目

使用Spring Initializr创建了四个模块,分别为Oauth2开放平台、资源服务器1、资源服务器2、第三方web平台,使用spring.boot 2.5.2。

2. 创建表结构

项目和SQL都放在在码云。

和Oauth2有关有6张表,oauth_client_details表就是保存Oauth2客户端账号密码、授权、回调地址等重要信息的表,其他的都是存储令牌、code等信息,实际可以不要。

表结构说明:

表名 描述
oauth_client_details 客户端账号密码、授权、回调地址等重要信息;核心表
oauth_access_token 存储access_token
oauth_refresh_token 存储refresh_token
oauth_client_token 存储从服务端获取的token数据
oauth_code 存储授权码
oauth_approvals 存储授权成功的客户端信息

3. 认证服务器基础环境

  1. 添加pom,注意security相关依赖

pom依赖:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-autoconfigure</artifactId></dependency><!--动态模板thymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--Thymeleaf提供的SpringSecurity标签控制支持--><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><!--Mysql 驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.8.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.8.0</version></dependency></dependencies>
  1. 添加yml相关配置
spring:application:name: oauth2-authorization-server-demodatasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1/security?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=falseusername: rootpassword: 123456hikari:minimum-idle: 5idle-timeout: 600000maximum-pool-size: 10auto-commit: truepool-name: MyHikariCPmax-lifetime: 1800000connection-timeout: 30000connection-test-query: SELECT 1security:user:name: userpassword: 123456
server:port: 20000
mybatis-plus:typeAliasesPackage: org.pearl.**.entityconfiguration:map-underscore-to-camel-case: truecall-setters-on-nulls: true
  1. 使用mybatis-plus代码生成器,生成相应代码。
  2. 启动项目,授权服务器基础环境配置完成

4. 搭建资源服务器

  1. 配置下不同的访问端口,添加以下依赖即可。
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-autoconfigure</artifactId></dependency></dependencies>

Spring Security系列(11)- Security5.0版本Oauth2开放平台环境搭建相关推荐

  1. Spring Security系列(10)- 微服务权限方案及Oauth2介绍

    微服务 什么是微服务 微服务由来 微服务最早由 Martin Fowler 与 James Lewis 于 2014 年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运 ...

  2. 使用Spring Security和OAuth 2.0保护Spring微服务架构

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个开发 ...

  3. Spring Security系列之Spring Social实现微信社交登录(九)

    社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...

  4. oauth2_带有Spring Security的OAuth 2.0快速指南

    oauth2 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验 ...

  5. 带有Spring Security的OAuth 2.0快速指南

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在构建W ...

  6. spring security系列一:架构概述

    一直以来都想好好写一写spring security 系列文章,每每提笔又不知何处下笔,又赖于spring security体系强大又过于繁杂,且spring security 与auth2.0结合的 ...

  7. Spring Security系列教程03--创建SpringSecurity项目

    前言 在上一章节中,一一哥 已经带大家认识了Spring Security,对其基本概念已有所了解,但是作为一个合格的程序员,最关键的肯定还是得动起手来,所以从本篇文章开始,我就带大家搭建第一个Spr ...

  8. SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——2.安装ros-kinetic

    SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建--2.安装ros-kinetic 摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式 ...

  9. SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04...

    SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建--1.安装系统ubuntu_mate_16.04 摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认 ...

最新文章

  1. vs2008\drivers\opengl_2.h.c_opengl基本功能介绍+示例
  2. python版本越高越好吗-Python 3.8 已发布,现在是切换至新版本的好时机吗?
  3. java中的static方法可以被重写吗?(从方法调用过程理解)
  4. SpringCloud 应用在 Kubernetes 上的最佳实践 — 部署篇(开发部署)
  5. “Java跌落向下,Python奋斗向前”,程序员:看哭了...
  6. Python开发规范
  7. Scanner和BufferedReader从控制台读取输入数据
  8. Redis 服务器安装
  9. PyCharm安装步骤
  10. css案例学习之父子块的margin
  11. discuz升级php版本版本502,dz2.5版本升级Discuz! X3.0详细教程
  12. 代码制作数字流星雨_C语言实现流星雨
  13. mysql主从架构的实现
  14. 第138天,我成为了CSDN博客专家,在搬砖的道路上继续努力
  15. Java项目:超市进销存管理系统(java+SSM+JSP+bootstrap+jQuery+mysql)
  16. 2011黑帽大会:由黑客操控的世界
  17. 技术分享 | 年终总结
  18. kaliLinux安装的常见镜像文件以及蓝屏处理
  19. Python基础学习1
  20. A Convolutional Neural Network for Modelling Sentences之每日一篇

热门文章

  1. JAVA+Selenium+Chrome+Chromedriver 模拟浏览器
  2. 虹科QA | SWCF2022 12月6日演讲笔记:C波段卫星与5G之间的干扰排查及解决方案
  3. MySQL数据库版本
  4. 服务器sas卡的作用,英特尔IOP34x处理器介绍
  5. 辽宁奥普泰12月26-29日参加2021第十八届CPSE安博会 7C01展位期待您的莅临
  6. Node模块--chalk
  7. Cursor:GPT-4 免费的强大代码编辑器
  8. 来聊聊,今年各互联网大厂的年终奖......
  9. 白鹭安装node_Egret Engine(白鹭引擎)介绍及windows下安装
  10. 数通基础-STP原理