Security+Oauth2权限认证(案例 源码)

简介: Security+Oauth2权限认证(案例 源码)

1.1 Oauth2认证流程:

20210625144352809.png

1.2 Token携带相关参数注释:


首先讲下资源与授权服务配置注解:


请求优先@EnableAuthorizationServer,@EnableResourceServer处理,剩下的无法匹配的由SpringSecurity处理


20210625144433867.png


2.1资源服务器配置:

20210625144458855.png


2.2其他属性:


accessDeniedHandler 授权失败且主叫方已要求特定的内容类型响应


resourceTokenServices加载 OAuth2Authentication 和 OAuth2AccessToken 的接口

eventPublisher 事件发布-订阅 根据异常的clazz触发不同event


2.2 授权服务器配置(两种方式):


A.手动:


20210625144543661.png

B.直接用数据库:

20210625144559962.png


2.3 配置授权服务器端点,如:令牌存储;令牌自定义;用户批准和授权类型 以及配置服务器端点的安全


20210625144649304.png


2.4 yml配置例子(以github作为认证服务器):


2021062514470931.png


2.5 引入依赖


20210625144728531.png

授权有授权码模式;隐式授权模式;密码模式;客户端模式;常用授权码和密码,介绍如下:


3.1 授权码模式:


20210625144758307.png

参数列表如下:


client_id:客户端id,和授权配置类中设置的客户端id一致。


response_type:授权码模式固定为code


scop:客户端范围,和授权配置类中设置的scop一致。


redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。


拿到授权码后申请令牌:


20210625144813178.png

20210625144819881.png


参数解释:


Access_token:访问令牌,客户端拿着访问令牌即可向服务提供方获取相应资源或信息

Refresh_token:刷新令牌,由于访问令牌是有失效时间的,所以一般情况下都是在访问令牌即将失效时使用刷新令牌可重新获取新的访问令牌


token_type:有MAC Token与Bearer Token两种类型,两种的校验算法不同,RFC 6750建议Oauth2采用 Bearer Token(http://www.rfcreader.com/#rfc6750)。


expires_in:过期时间,单位为秒。


scope:范围,与定义的客户端范围一致。


3.2 资源服务器授权配置:


1 配置公钥:


20210625144856808.png


3 在config包下创建ResourceServerConfig类


4 资源服务器测试是否携带令牌以及令牌是否有效:


20210625144911782.png


注:若不携带令牌或令牌过期或错误则无法验证一般报如下错误:


20210625144923997.png

20210625144929881.png

3.3 密码模式:(相对授权码而言少了一步授权码获取 由用户直接将用户名密码传给客户端 客户端直接拿着这两个去申请令牌)

20210625145012452.png


参数:


grant_type:密码模式授权填写password


username:账号


password:密码


20210625145025343.png


上边参数使用x-www-form-urlencoded方式传输,使用postman测试如下:

20210625145035888.png


参数:


client_id:客户端准入标识。

client_secret:客户端秘钥。

grant_type:授权类型,填写password表示密码模式

username:资源拥有者用户名。

password:资源拥有者密码


注意:当令牌没有过期时同一个用户再次申请令牌则不再颁发新令牌。


校验令牌:


20210625145056592.png


校验成功则会返回与该令牌绑定的相关用户信息


参数列表:


exp:过期时间,long类型,距离1970年的秒数(new Date().getTime()可得到当前时间距离1970年的毫秒数)。


user_name: 用户名


client_id:客户端Id,在oauth_client_details中配置


scope:客户端范围,在oauth_client_details表中配置


jti:与令牌对应的唯一标识


companyId、userpic、name、utype、id:这些字段是本认证服务在Spring Security基础上扩展的用户身份信息


刷新令牌的使用

20210625145109525.png


生成一个新的访问令牌


grant_type : 固定为 refresh_token


refresh_token:刷新令牌(注意不是access_token,而是refresh_token)


注:刷新令牌成功,会重新生成新的访问令牌和刷新令牌,令牌的有效期也比旧令牌长。

刷新令牌通常是在令牌快过期时进行刷新。


Xml配置:


20210625145121616.png

3.4 WebSecurityConfig中HttpSecurity一些参数解释:

20210625145132969.png

3.5 Jwt令牌:


jwt与token的验证思路区别:


Token:后端接收到前端传过来的token,若果是通过数据库或redis或session进行对比验证,这种方式为令牌验证


用户输入用户名和密码,发送给服务器。


服务器验证用户名和密码,正确的话就返回一个签名过的token(token 可以认为就是个长长的字符串),浏览器客户端拿到这个token。


后续每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效,如果有效那么认证就成功,可以返回客户端需要的数据。 特点: 这种方式的特点就是客户端的token中自己保留有大量信息,服务器没有存储这些信息。


Jwt:后端接收到前端传过来的token,如果是通过一套加密解密算法(RSA)来确定用户的身份是否合法,这种方式为jwt(Header头部(令牌的类型(即JWT)及使用的哈希算法(如HMACSHA256或RSA)),Payload负载(内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比如:iss(签发者),exp(过期时间戳),sub(面向的用户)等,也可自定义字段。此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分)和Signature签名(用于防止jwt令牌被篡改)。由三部分生成token,三部分之间用“.”号做分割)


2 生成公钥和私钥:


20210625145322643.png


参数解释:


Keytool是一个java提供的证书管理工具


-alias:密钥的别名


-keyalg:使用的hash算法


-keypass:密钥的访问密码


-keystore:密钥库文件名,


xc.keystore保存了生成的证书


-storepass密钥库的访问密码


查询证书信息:


Keytool -list -keystore wang.keystore


删除别名:


Keytool -delete -alias xckey -keystore wang.keystore


3 导出公钥:


需要先下载openssl(加解密工具


包):http://slproweb.com/products/Win32OpenSSL.html并配置对应的环境变量


4 cmd进入wang.keystore所在目录执行:


keytool -list -rfc --keystore wang.keystore | openssl x509 -inform pem -pubkey


20210625145408747.png


上半部即为公钥 将其放到编辑器 调整为一行


生成jwt令牌:


20210625145420604.png

2021062514542620.png


校验令牌:


20210625145435493.png


结果:


20210625145446390.png



目录
相关文章
|
前端开发 微服务 容器
springcloud - 使用knife4j聚合微服务接口文档
springcloud - 使用knife4j聚合微服务接口文档
springcloud - 使用knife4j聚合微服务接口文档
|
5月前
|
供应链 监控 JavaScript
ERP 系统中的 BOM 到底是什么意思?
BOM(物料清单)是制造企业的核心数据,不仅记录产品所需物料及数量,还定义装配关系与层级结构。它贯穿研发、生产、采购、库存及财务流程,影响企业效率与成本控制。本文详解BOM的定义、种类及其在ERP系统中的关键作用,帮助理解其在制造管理中的重要地位。
|
12月前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
4002 101
|
人工智能 关系型数据库 文件存储
DIY nas 之--照片管理工具PhotoPrism
PhotoPrism是一个开源的照片管理工具,是一款由AI驱动的应用程序,主要用于浏览、组织和分享您的照片集。
939 3
|
负载均衡 应用服务中间件 网络安全
深入理解Nginx与Ribbon的区别
深入理解Nginx与Ribbon的区别
397 0
|
Shell 开发工具 git
如何将本地项目上传到github上
如何将本地项目上传到github上
399 0
|
安全 Java 微服务
十四.SpringCloud+Security+Oauth2实现微服务授权 - 网关统一鉴权
SpringCloud+Security+Oauth2实现微服务授权 - 网关统一鉴权
|
存储 安全 API
Swift 面试题及答案整理,最新面试题
Swift 面试题及答案整理,最新面试题
1026 0
|
Java 编译器 Shell
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
【Python 基础教程 04】超详细Python编程教程:初学者入门至全面了解Python 解析器( CPython、IPython、Jython和PyPy)
666 0