文章目录
一、环境基础
中间件/编程语言 | 版本 |
---|---|
java | 1.8+ (1.8建议用291版本) |
springboot | 2.5.0.REKASE |
某些名词概念信息,可以参考链接文章,主要是对Spring-cloud-oauth2中内容的描述
二、示例工程
之所以出现基于内存示例描述,是因为可以以sql或nosql等方式去存储
(1)(内存)入门示例
主要了解Spring-Security的用户校验功能
示例链接:https://github.com/CoffeeAndIce/spring-security/tree/master/security-demo-1
默认上,如果都不设置,一旦配置了依赖并启动
就会生成基于user为用户名,利用UUID.randomUUID().toString()生成随机 密码的
一个基本用户让你登陆校验。
其中,密码会在控制台中输出
(2)(内存)权限控制示例
(1)了解权限注解的具体使用
(2)了解自定义编码器的定义方式
示例链接:https://github.com/CoffeeAndIce/spring-security/tree/master/security-demo-2
一般来说,定义的用户拥有什么权限,我们是需要定义的。
同时,用户能基于这个权限,能访问我们什么端点(接口/URL),端点上如何限制访问又是一个问题
我们除了使用Spring-Security自带的密码编码器外,还可以自定义编码器吗?
(3)整合Spring-Session
主要针对多台机器Session问题方案处理,利用集群机制之外的处理方案,避免宕机后交互数据不正常
示例:https://github.com/CoffeeAndIce/spring-security/tree/master/security-demo-3
基于Redis 存储方案
(1)需要基于redis 2.8+ 以上的中间件
示例链接:https://github.com/CoffeeAndIce/spring-security/tree/master/security-demo-3/RedisHandler
基于MongoDB存储方案
示例链接:https://github.com/CoffeeAndIce/spring-security/tree/master/security-demo-3/MongoDBHandler
(4)(内存)oauth2-授权与资源分离
(1)授权服务器与资源服务器分离搭建
(2)基础测试模型搭建
(3)相关接口的postMan 脚本是基于2.0的格式的,在链接同目录下
示例链接 https://github.com/CoffeeAndIce/spring-security/tree/master/security-demo-4
测试端点描述 | 原生模型 |
---|---|
密码模式(password) | 是 |
授权码模式(authorization_code) | 是 |
简化模式(implicit) | 是 |
客户端模式(client_credentials) | 是 |
校验令牌 | 是 |
刷新令牌 | 是 |
删除令牌 | 否 |
(5) 基于jwt自定义登陆方式的处理
(1) 利用
WebSecurityConfigurerAdapter
定义自己的鉴权方式
(2) 分析WebSecurityConfigurerAdapter
的基于表单及自定义的鉴权流程
示例链接: https://github.com/CoffeeAndIce/spring-security/tree/master/security-demo-5
什么是JWT(JSON WEB TOKEN)
适用于分布式站点传递信息的一个标准(本身不保证安全)【简单对称算法】
整体来说就就是将标识部分
和信息内容部分
进行加密处理,以最后一部分进行加密验证
通常现在整体结构分为三个部分:header、playload、signature,以圆点.
组合拼接构成
1、header(头部信息)
对头部内容进行base64编码
{
'typ': 'JWT', //这个基本不需要变化,用于统一标准辨识,当然有个人需要也可以改变
'alg': 'HS256' //举例子都用默认的,当然这里可以自定义算法,用于自辨析
}
2、playload(信息载体)
对内容进行base64编码【尽量不要将涉密信息写在里面】
{
"expire": "1234567890", //设置过期时间是为了更好使用令牌
"name": "Ringo",
}
3、signature(签名验证)
这部分开始组装,将1、2部分的内容以圆点
.
连接,设为X
将X以声明的方式
HS256
(上方假定的加密方式)加密X
与自定义盐(自定义的salt)组合的内容,形成第三部分
// 伪代码如下
let X = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
let signature = HMACSHA256(X, 'secret');// secret指代自定义加盐
最后jwt为:
X+‘.’+signature ==> jwt