Spring Security Oauth2.0认证授权
-
Spring Security:安全框架
-
OAuth2.0:用于分布式认证授权
-
JWT:与OAuth2.0相关的令牌
1、基本概念
1.1什么是认证
- 输入账号和密码登录微信的过程就是认证
- 判断用户身份合法的过程
系统为什么要认证
- 保护系统隐私数据和资源
1.2什么是会话
- 为了避免用户的每次操作都进行认证可将用户的信息保存在会话中
- 保持当前用户登录状态所提供 的机制
输入支付密码,是二次认证
会话的2种方式
1:基于session方式
- 保存到服务端cookie中
- 每次请求带session_id
2:基于token方式
- 客户端可以放cookie中,或者放在localStorage中存储,服务端大可不必存token(基于JWT校验)
- 每次请求带token
1.3什么是授权
- 保证资源是否有权限使用
比如微信认证(登录)后,是否绑定银行卡==>是否可以发红包
授权的2种资源
-
功能资源:系统菜单、页面、按钮、代码方法
-
实体(数据)资源:2类
- 资源类型:商品信息
- 资源实例:商品编号为001的商品
who(主体) what(资源) how(权限)
1.4授权的数据模型
1.4.1 授权的数据模型6张表
- 主体:(用户id、账号、密码、…)
- 资源:(资源id、资源名称、访问地址、…)
- 权限:(权限id、权限标识、权限名称、资源id、…)
- 角色:(角色id、角色名称、…)
- 角色和权限的关系:(角色id、权限id)
- 主体和角色的关系:(用户id、角色id、…)
- 主体、资源、权限关系图如下
以上是6张数据表的关系
1.4.2 授权的数据模型5张表(优化)
优化后的授权数据模型
- 权限和资源是多对一
- 合并权限和资源表
- 权限:(权限id、权限标识、权限名称、资源名称、资源访问地址、…)
- 修改后数据模型之间的关系如下图:
1.5 RBAC实现授权
企业常用RBAC实现授权
1.5.1 基于角色的访问控制
按角色进行授权(Role-Based Access Controller)
案例:
问题:如果查询工资的角色变化为总经理和部门经理,还有项目经理可访问,此时就需要修改判断逻辑
根据上边案例发现,当需要修改角色的权限时就需要修改授权的相关代码,系统可拓展性差
1.5.2 基于资源的访问控制
按资源进行授权(Resource-Based Access Controller)
代码案例:
优点:系统设计时定义好查询工资的权限标识,即使查询工资所需要的角色变化,都不需要修改授权代码,系统可扩展性强
2、基于session的认证方式
2.1 认证流程
2.2 springmvc session认证
-
自己写登录页面
-
自己写登录时,校验账户和密码
-
自己写拦截器
-
拦截器进行拦截请求,资源分配
2.3 Spring security 快速上手
- 不需要自己设置拦截器
- 自带登录界面
- 帮助校验账户和密码:UserDetailService
- 需要初始化
有包的版本问题,建议和项目上一致
2.4 Spring security集成Spring boot
-
导入依赖
springboot项目不需要 applicationContext.xml (spring的配置)—-用application.yaml代替
- spring容器需要初始化
- springboot不需要
3、spring security的工作原理
spring security解决的问题就是安全访问控制
spring security对web资源的保护是靠多个Filter实现的
3.1 认证的流程
5个数据表
4、授权
- web授权—-进行url拦截
- 方法授权—到Controller中进行注解添加
注解
@PreAuthorize :方法执行前拦截
@PostAuthorize:方法执行后拦截
@Secured:不推荐使用
5、分布式系统认证方案
共享性(统一)、开放性(第三方)
5.1 分布式认证需求
分布式每个服务都有认证、授权的需求,每个服务都实现一套认证逻辑会非常冗余
-
统一的认证授权
- 要实现统一认证方式可扩展,不同类型用户,进行统一认证授权,支持各种认证需求,比如:用户密码认证、短信验证码、二维码、人脸识别等认证方式
-
应用接入认证
- 支持第三方应用接入,供应扩展和开放能力
5.2选型分析
-
基于session的认证方式
Session复制:多台应用服务企器之间同步session,使session保持一致性,对外透明
Session黏贴:当用户访问集群中某台服务器后,强制指定后续的所有请求均落到此机器上
Session集中存储:将session存入分布式缓存中,所有服务器应用实例统一从分布式缓存中存取session
优点:更好的在服务端对会话进行控制,且安全性高
缺点:session机制方式基于cookie,无法跨域,另外随着系统的扩展,需要提高session复制、黏贴、和集中式存储的容错性
-
基于token的认证方式
优点:容易维护、扩展性强
缺点:token包含的数据量大,每次请求都需要传递,占宽带。token签名验证对cpu产生处理负担
5.3 oauth2.0是什么
-
专门为第三方系统认证所设计的认证协议
-
允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息
-
JWT令牌格式
案例:微信登录(第三方授权访问)
6、spring cloud security oauth2.0介绍
- 授权服务 UAA
- 资源服务 Order、Product、…
6.1 创建maven父工程
6.2 创建maven子工程
6.3 创建资源工程
6.4授权服务器配置
6.5 配置授权端点的url
6.5.1 默认的url
7、授权码模式
- 授权服务配置AuthorizationServer
- 令牌管理配置TokenConfig
- WebSecurityConfig认证配置
- Service层
- dao层
- pojo层
7.启动类
- 浏览器访问地址(参数自己在ClientDetailsServiceConfigurer中定义的)拿到授权码
- 客户端拿到授权码向 授权服务器 索要访问access_key申请令牌
7.1创建表
第三方认证通过
安全性最高
8、简化模式授权
Get请求直接获取
9、JWT介绍
基于token的认证方式,每次都需要进行远程调用密码校验,影响性能
所以采用JWT令牌方式解决此问题(JSON WEB TOKEN),本身存储签名信息
JWT令牌
优点:
1)jwt基于json,非常方便解析
2)可以在令牌中自定义丰富的内容,易拓展
3)通过非对称加密算法以及数字签名技术,JWT防止篡改,安全性高
4)资源服务使用JWT不依赖认证服务即可完成授权
缺点:
JWT令牌比较长,占用存储空间比较大
头部信息+内容+签名(防止篡改)
9.1 测试JWT密码模式获取令牌
Post密码模式获取令牌 【仅用于内测人员】
9.2 测试授权码模式获取令牌
Get获取授权码code
POST申请令牌
9.3 测试简化模式获取令牌
GET请求
10、spring security实现分布式系统授权
7.1 注册中心创建
配置文件
启动类
distributed-security-order资源的配置
uaa服务同上。。。
7.2 网关创建
启动类
7.2.1网关整合OAuth2.0有两种思路
1:一种是认证服务器UAA生成jwt令牌,所有请求在网关层验证,判断权限等操作
2:一种是由各资源服务处理,网关只做请求转发
-
TokenConfig配置jwt令牌模式
-
ResourceServerConfig配置资源验证
- WebSecurityConfig配置放行所有url请求
- AuthFilter配置明文令牌toekn转发给微服务的过滤器
- 转Base64的方法类
7.3 资源如何处理网关传过来的明文token令牌
- 客户端访范围
- jwt令牌策略
-
资源的过滤器TokenAuthenticationFilter
解析头文件中的token,将一些信息给security
解码工具类
头信息对象
- 资源处获取
11、进行集成测试
- 启动所有的类
- 申请令牌
- 校验令牌
- 进行资源访问
12、总结
12.1 spring security中网关与微服务的关系
- 网关只进行token转发
- 微服务进行授权校验
12.2 Userdetails的扩展方式
1:修改UserDetails对象
2:转成json对象,放到令牌中
12.3 springMvc如何进行资源的认证和授权?
- 在springmvc中,我们通过继承HandlerInterceptor拦截器,在url访问资源前进行权限匹配
- 匹配成功进行认证,认证通过将session_key存到session域中
- 当用户注销登录时,清空session域就行了
12.4 spring security框架如何进行资源认证和授权
- WebSecurityConfigurerAdapter【Web安全配置适配器】
12.5 spring boot security如何进行认证和授权
- 客户身份信息认证
- 安全拦截
- 开启方法形式的认证
12.6 spring cloud 微服务+分布式 security+oauth2.0如何进行认证和授权
-
通过单独的UAA认证服务进行认证和安全拦截
所有的登录认证请求必须经过此服务器—>令牌获取AuthorizationServer
远程资源拦截机制
-
网关将uaa认证服务的令牌进行发送
WebSecurityConfigurerAdapter网络安全适配器:放行所有请求
ResourceServerConfigurerAdapter资源服务配置器:有哪些微服务资源—>用户需要什么样的权限才能使网关发配token
ZuulConfig网关配置:允许跨域+优先级配置
ZuulFilter网关过滤器:通过过滤器对token令牌进行明文分配—>最后才能访问微服务
-
各个微服务资源如何获取令牌进行认证和授权
OncePerRequestFilter【每个请求过滤一次】
ResourceServerConfigurerAdapter资源服务适配器:进行令牌认证+授权
- 进行security授权
spring security oauth2.0认证授权实例
1、用户认证技术方案
1.1 单点登录技术方案
-
用于分布式系统—>只登陆一次就可以访问所有有权限的服务,不需要每个系统都做一套认证系统
-
制作一套认证系统—>将认证从各个功能中抽离出来
-
利用Redis存储用户的身份
-
访问所有系统—>认证系统—>从Redis中查找token
1.2 单点登录的特点
- 认证系统是独立的系统
- 各个系统通过http或者其他协议与认证系统进行通信
- 用户身份信息存储在Redis集群中
Java能实现单点登录的认证框架:
- Apache Shiro
- CAS
- Spring security CAS
2、第三方认证技术方案
2.1 Oauth2.0认证技术方案
- 主要研究授权码+密码的认证模式
2.2 spring security oauth2.0工作流程图
2.3 spring security oauth2.0授权码服务,资源服务授权流程
- UAA授权服务利用【私钥】生成令牌?
- 资源服务利用【公钥】进行校验令牌?
- 导入oauth2认证依赖
- 导入ResourceConfig配置
- 导入public.key公钥
3、spring security oauth2.0密码模式授权
3.1密码模式特点
- 不需要授权码
- 参数
-
grant_type:密码模式授权填password
-
username:账号
-
password:密码
POST请求:http://localhost:8080/auth/oauth/token
- 此链接需要使用http Basic认证+客户端id+客户端password
AUU认证服务接收到申请令牌的请求—->调用UserDetailsService接口—>将信息放入token中
3.2 UserDetailsService接口
- 客户端验证
- 用户信息验证
3.3 密码模式令牌生成好后的操作
GET: http://localhost:40400/auth/oauth/check_token?token 【校验令牌】
登录时:密码模式授权
访问资源时:校验令牌
令牌过期时:刷新令牌
4、spring security JWT
- 不需要资源Web远程校验【web请求】 客户端—>资源服务—>UAA认证服务 :性能低下
- 直接资源服务自己校验 客户端—>资源服务
4.1 JWT令牌如何校验
- JWT可以使用HMAC算法或使用RAS的公钥和私钥进行数字签名校验,防止被篡改
4.2 JWT令牌结构
-
Header
包括令牌的类型+哈希算法
-
Payload负载
存放有效信息类容
-
Signature签名
防止jwt内容被篡改该
使用Base64Url编码
header+”.”+payload—>数字签名
4.3 创建JWT令牌的准备工作
密钥证书:公钥+私钥
JDK生成密钥证书:
keytool -genkeypair -alias carterkey -keyalg RSA -keypass root -keystore carter.keystore -storepass rootstore
Keytool 是一个java提供的证书管理工具
-alias:密钥的别名
-keyalg:使用的hash算法
-keypass:密钥的访问密码
-keystore:密钥库文件名,xc.keystore保存了生成的证书
-storepass:密钥库的访问密码
- 查看证书信息
keytool -list -keystore carter.keystore
4.4 利用私钥生成令牌
利用证书—>私钥+内容—>jwt
4.5 利用公钥校验令牌
公钥错误—>生成JWT令牌错误(spring security已经做)
5、Redis存储JWT令牌
- 是否过期
6、spring security oauth2.0登录注册案例
6.1 什么时候发放令牌
6.2 客户端id—参数放在哪里?
在application.yml中配置参数
6.3 原远程生成令牌代码实现
【AUU认证服务】里面集成了spring security
- 远程请求 spring security 生成令牌
- 远程调用userLogin方法
userLogin方法用来申请令牌(账号+密码+客户端id)
- AUU服务的Controller层
域名:carter.com—指向—>localhost:8080 相当网关的反向代理 nginx技术
- Service层
客户端id—>yaml中存取
将令牌存到cookie中
利用POST请求仿用户登录
问题:请求被spring security拦截了
-
Header
包括令牌的类型+哈希算法
-
Payload负载
存放有效信息类容
-
Signature签名
防止jwt内容被篡改该
使用Base64Url编码
header+”.”+payload—>数字签名
4.3 创建JWT令牌的准备工作
密钥证书:公钥+私钥
JDK生成密钥证书:
keytool -genkeypair -alias carterkey -keyalg RSA -keypass root -keystore carter.keystore -storepass rootstore
Keytool 是一个java提供的证书管理工具
-alias:密钥的别名
-keyalg:使用的hash算法
-keypass:密钥的访问密码
-keystore:密钥库文件名,xc.keystore保存了生成的证书
-storepass:密钥库的访问密码
- 查看证书信息
keytool -list -keystore carter.keystore
4.4 利用私钥生成令牌
利用证书—>私钥+内容—>jwt
4.5 利用公钥校验令牌
公钥错误—>生成JWT令牌错误(spring security已经做)
5、Redis存储JWT令牌
[外链图片转存中…(img-eakJQmpw-94)]
- 是否过期
6、spring security oauth2.0登录注册案例
6.1 什么时候发放令牌
[外链图片转存中…(img-vfLjLN8s-96)]
6.2 客户端id—参数放在哪里?
在application.yml中配置参数
6.3 原远程生成令牌代码实现
【AUU认证服务】里面集成了spring security
- 远程请求 spring security 生成令牌
- 远程调用userLogin方法
userLogin方法用来申请令牌(账号+密码+客户端id)
- AUU服务的Controller层Navicat Premium 12.1.23激活
域名:carter.com—指向—>localhost:8080 相当网关的反向代理 nginx技术
- Service层
客户端id—>yaml中存取
将令牌存到cookie中
利用POST请求仿用户登录
问题:请求被spring security拦截了
今天的文章
Navicat Premium 12.1.23激活(Spring Security Oauth2.0认证授权)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/106478.html