Spring Security系列(11)- Security5.0版本Oauth2开放平台环境搭建
前言
上篇文档,我们了解了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. 认证服务器基础环境
- 添加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>
- 添加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
- 使用mybatis-plus代码生成器,生成相应代码。
- 启动项目,授权服务器基础环境配置完成
4. 搭建资源服务器
- 配置下不同的访问端口,添加以下依赖即可。
<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开放平台环境搭建相关推荐
- Spring Security系列(10)- 微服务权限方案及Oauth2介绍
微服务 什么是微服务 微服务由来 微服务最早由 Martin Fowler 与 James Lewis 于 2014 年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运 ...
- 使用Spring Security和OAuth 2.0保护Spring微服务架构
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个开发 ...
- Spring Security系列之Spring Social实现微信社交登录(九)
社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...
- oauth2_带有Spring Security的OAuth 2.0快速指南
oauth2 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验 ...
- 带有Spring Security的OAuth 2.0快速指南
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在构建W ...
- spring security系列一:架构概述
一直以来都想好好写一写spring security 系列文章,每每提笔又不知何处下笔,又赖于spring security体系强大又过于繁杂,且spring security 与auth2.0结合的 ...
- Spring Security系列教程03--创建SpringSecurity项目
前言 在上一章节中,一一哥 已经带大家认识了Spring Security,对其基本概念已有所了解,但是作为一个合格的程序员,最关键的肯定还是得动起手来,所以从本篇文章开始,我就带大家搭建第一个Spr ...
- SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——2.安装ros-kinetic
SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建--2.安装ros-kinetic 摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式 ...
- SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04...
SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建--1.安装系统ubuntu_mate_16.04 摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认 ...
最新文章
- vs2008\drivers\opengl_2.h.c_opengl基本功能介绍+示例
- python版本越高越好吗-Python 3.8 已发布,现在是切换至新版本的好时机吗?
- java中的static方法可以被重写吗?(从方法调用过程理解)
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 部署篇(开发部署)
- “Java跌落向下,Python奋斗向前”,程序员:看哭了...
- Python开发规范
- Scanner和BufferedReader从控制台读取输入数据
- Redis 服务器安装
- PyCharm安装步骤
- css案例学习之父子块的margin
- discuz升级php版本版本502,dz2.5版本升级Discuz! X3.0详细教程
- 代码制作数字流星雨_C语言实现流星雨
- mysql主从架构的实现
- 第138天,我成为了CSDN博客专家,在搬砖的道路上继续努力
- Java项目:超市进销存管理系统(java+SSM+JSP+bootstrap+jQuery+mysql)
- 2011黑帽大会:由黑客操控的世界
- 技术分享 | 年终总结
- kaliLinux安装的常见镜像文件以及蓝屏处理
- Python基础学习1
- A Convolutional Neural Network for Modelling Sentences之每日一篇
热门文章
- JAVA+Selenium+Chrome+Chromedriver 模拟浏览器
- 虹科QA | SWCF2022 12月6日演讲笔记:C波段卫星与5G之间的干扰排查及解决方案
- MySQL数据库版本
- 服务器sas卡的作用,英特尔IOP34x处理器介绍
- 辽宁奥普泰12月26-29日参加2021第十八届CPSE安博会 7C01展位期待您的莅临
- Node模块--chalk
- Cursor:GPT-4 免费的强大代码编辑器
- 来聊聊,今年各互联网大厂的年终奖......
- 白鹭安装node_Egret Engine(白鹭引擎)介绍及windows下安装
- 数通基础-STP原理