Spring Cloud项目OAuth2授权验证终极必杀技
一、OAuth2兴起背景
OAuth2是一种授权验证获取用户信息的标准,在传统的用户认证体系中,想要获取用户信息必须通过输入用户名和密码,不是很安全。必须记录登录的Session会话状态,十分不利。
(图片)
那么有没有一种标准,无需记录登录Session状态,就能获取用户信息呢?最早的思路是基于Spring Session,利用Redis存储Session,客户端请求只需要在Header中携带特定的header,后端服务端就能获取用户信息。
随着技术的进一步升级,JWT大行其道,JWT确实有自身的优势,加盐加密用户信息,Token中采用相同解密算法就能获取到用户信息,还能控制有效期,很好的解决了用户认证的需求。应该说,通过这一步,已经能够满足绝大多数企业的用户需求了。
(JWT图片)
虽然,JWT已经能满足用户的处理逻辑需求。那么,有没有更好的方式更安全的方式进行权限验证呢?Spring Security OAuth2标准横空出世,基于OAuth2,提供了更安全的方式进行验证拦截,getCodeToken也很方便,指定的标准去做就可以了。
除此之外,OAuth2还可以扩展登录认证方式,邮箱登录、验证码登录、扫码登录都可以集成扩展。还支持前后端分离的Token认证方式,十分便捷,因此被更多的公司关注采用。
二、邂逅OAuth2
笔者曾经在一家互联网公司就职,当时要扩展微信公众号的功能。参与微信公众号的开发,当时就接触了微信的身份认证方式。当时觉得很复杂,要授权,还要设置回调跳转地址,看API看的不是很明白,差点想放弃。
第一次设置回调地址,再加上前端需要编写getCodeToken,终于成功拿到微信端Token,实现相关功能。
第一次接触微信是基于OAuth2标准实现登录授权,虽然不懂原理,但还是在参考了大量资料的情况下完成了任务,算是有所成就。
三、完成Spring Cloud+OAuth2工程的搭建
搭建Spring Cloud工程,引入Spring Cloud依赖仓库坐标
![4e0f7ba6cb5dcfd7e8e069aebebf5473.png](https://i-blog.csdnimg.cn/blog_migrate/13d8d44075887aeaaa697ee2d959b863.jpeg)
指定了Spring Cloud项目的基本依赖
在Pom.xml文件,引入需要的配置及工具
![c65542ac4cfaff7fc7a48b558fe94f0c.png](https://i-blog.csdnimg.cn/blog_migrate/b440503431ccba71a55ca7a4b95c6c40.jpeg)
在子工程,构建Spring Boot Web工程:
![e2d57ebe45a64ff9a374026e2abb132c.png](https://i-blog.csdnimg.cn/blog_migrate/b4a3df77e1b10ebfe2802f784a738c63.jpeg)
引入OAuth2的核心依赖:
![5e3d05709bdab855ea8c12661452da1b.png](https://i-blog.csdnimg.cn/blog_migrate/5207ab2f9bb6591417aa0898722e7d57.jpeg)
引入Redis作为Token的存储介质:
![5b9a6752a060a854bfc8c40cbb7c5d92.png](https://i-blog.csdnimg.cn/blog_migrate/9a3c9946bed7533b3bc7b572c1f41bf2.jpeg)
引入MySQL作为客户端登录需要的配置密钥:
![10039f29e80b580993c0243cdd0a5a56.png](https://i-blog.csdnimg.cn/blog_migrate/6587fa911d458ae569fa540069609b19.jpeg)
引入JDBC:
![273dd41c0de1945c67017222a8a90598.png](https://i-blog.csdnimg.cn/blog_migrate/3122e60fc1dbcf4640cc324c6505d9ae.jpeg)
引入Swagger:
![3b4ff7190803f944c03c205a7f5bd8d8.png](https://i-blog.csdnimg.cn/blog_migrate/62ab71362aff39e91ae261638b1da28d.jpeg)
引入前端组件:
![7d77c4384bcc939e9121545b00ff3c42.png](https://i-blog.csdnimg.cn/blog_migrate/2eee6b381dbd80ae0ddb5dd74d6690bf.jpeg)
至此,工程构建完毕!
四、主工程模块介绍
打开application.yml,配置客户端登录标识:
![2845dab8d497fb658d4c751f7ccef2c0.png](https://i-blog.csdnimg.cn/blog_migrate/933e4c6ec6f961fab06e62048b9aa41c.jpeg)
主工程结果返回实体:
![18681586cf5a7fe7eb92b483c5eaff1d.png](https://i-blog.csdnimg.cn/blog_migrate/b98d38795f95decbcc9fc266045bac43.jpeg)
指定用户实体类,Spring Security用户类:
![281d30a134ede1a403510958f066d5d7.png](https://i-blog.csdnimg.cn/blog_migrate/ef564941b8a856bcb2ecd05aa7038c58.jpeg)
配置客户端属性工具:
![a673d933064d7c93d4afd4b595834fba.png](https://i-blog.csdnimg.cn/blog_migrate/28f420dc228ca87698de9dec52f4e2b4.jpeg)
配置客户端密钥:
![e0d4bdef274ee50f146f77114e011986.png](https://i-blog.csdnimg.cn/blog_migrate/e34ae9baea41b90e6cf348a7499fd72a.jpeg)
指定授权码模式登录之后的页面:
![79b70b6698fbfd9547cbc9be13345036.png](https://i-blog.csdnimg.cn/blog_migrate/33f4bf8e006cf9bdfd438988325c9f2b.jpeg)
指定OAuth2配置验证实体类:
![0075a515a02215219fc9a420574e4749.png](https://i-blog.csdnimg.cn/blog_migrate/4b3ad19304442e6384bc606bbbcacba3.jpeg)
指定授权码登录跳转的处理页面:
![c285ed8e150f248bf17c7b1de93ac275.png](https://i-blog.csdnimg.cn/blog_migrate/ddcc8b6ca20e602693e73b2415b69d2e.jpeg)
指定授权确认页面:
![beafda276de55f2022d0199e11f95c06.png](https://i-blog.csdnimg.cn/blog_migrate/38498869827e56d9a73155611bcea62d.jpeg)
指定用户验证实体UserDetailService:
![f92d39bd6d2493a070db76567ffdebd7.png](https://i-blog.csdnimg.cn/blog_migrate/bfb7a8f9b2f6966dbbaf712aac5d6dab.jpeg)
其中loadUserByUsername为验证用户的工具:
![45d8a55529341ed06111d9d69a18d930.png](https://i-blog.csdnimg.cn/blog_migrate/8fd2570b676d0c6445f2fea2245b932e.jpeg)
找出用户实体
4.1 OAuth2核心处理工具
设置允许的请求方式:
![bb66d0727c82c6aabf8e9293bd2df436.png](https://i-blog.csdnimg.cn/blog_migrate/0e4c0524a3452c1217413ca7097b26f0.jpeg)
指定认证服务器:
![abf704d1254c8ef2c11dc0c7dcbedfac.png](https://i-blog.csdnimg.cn/blog_migrate/92fd1ee42849e4705ae72c8d70430a2b.jpeg)
设置允许的安全认证方式:
![35d3217d314a1d17d4540eac0b7440f4.png](https://i-blog.csdnimg.cn/blog_migrate/c605ca9eb394334eb3b36fd31a30dd05.jpeg)
设置认证方式及支持的Token存储时间:
![1341a8cf2b59cacd3ab8d12b438bd792.png](https://i-blog.csdnimg.cn/blog_migrate/243d0192d9195a92e5d9b502298b0942.jpeg)
设置令牌处理服务器:
![f678de7581c9a0e9af3c3ca01dd97927.png](https://i-blog.csdnimg.cn/blog_migrate/a89539061785f4f7aef555d2a5ef3e58.jpeg)
指定WebSecurity的处理逻辑:
![d17bc31ccf4b653290574c1ebc80eecc.png](https://i-blog.csdnimg.cn/blog_migrate/577f59fdf50c5bad7b163c615a7a90ad.jpeg)
指定登录页及Token请求地址:
![1bd871ab72be5c7c7421bb124f741869.png](https://i-blog.csdnimg.cn/blog_migrate/d5cf0d5462492018c07fc26545a2dde5.jpeg)
五、运行代码看效果
5.1密码模式登录
打开PostMan输入地址:
http://localhost:4761/token/getToken
输入用户用户名密码:
![b7b17b3ea05f0aafee08992ebfd13878.png](https://i-blog.csdnimg.cn/blog_migrate/2db00d510b27974195e5360a7e1753a4.jpeg)
指定了授权类型为密码模式
返回结果:
![6f92bdb574569f55016c64e8555ff5bf.png](https://i-blog.csdnimg.cn/blog_migrate/ad8419c7566424ccac435593c06d06ca.jpeg)
用户名密码模式验证成功
5.2Refresh Token模式
将步骤一里面的返回参数refresh_token取出来作为入参,修改登录模式为刷新模式
![f2b3450a9fce421fd6d5508c963790c0.png](https://i-blog.csdnimg.cn/blog_migrate/f1fe886a3ca95cbc0fc14648d49bc5f5.jpeg)
依然是调用
http://localhost:4761/token/getToken
返回结果:
![7e5fac5304ac06abd2354e70a51baa92.png](https://i-blog.csdnimg.cn/blog_migrate/d8af7c03a2ffa4f7d15fc05ffb4aef8c.jpeg)
5.3授权码模式
打开网页浏览器:
http://127.0.0.1:4761/oauth/authorize?response_type=code&client_id=liyue&redirect_uri=http://localhost:9080/sso1/login&state=test&scope=server
返回结果进入统一认证中心:
![584a1557a0c5cb79ef41864f7ebf9b63.png](https://i-blog.csdnimg.cn/blog_migrate/160e32df2a7540bdf34d4e4a2bbe4564.jpeg)
输入账号:admin/123456
链接中拿到了code
![dd8f5093cb05cffce6e08d8898594492.png](https://i-blog.csdnimg.cn/blog_migrate/65ac9637bf591de7eaeeaa64245de368.jpeg)
用PostMan请求GET获取getCodeToken的接口:
http://127.0.0.1:4761/oauth/token?grant_type=authorization_code&client_id=liyue&client_secret=123456&redirect_uri=http://localhost:9080/sso1/login&code=5QwpoR&scope=server
![02d6651dfaeb9f936d9814131d38ca06.png](https://i-blog.csdnimg.cn/blog_migrate/76238f61bdb924a15f2a3b4642c5f2f1.jpeg)
返回结果拿到了Token
5.4客户端模式登录
打开PostMan选用Post方式,url:
http://127.0.0.1:4761/oauth/token
![e11ed847d1ae31815025275c8388f0f7.png](https://i-blog.csdnimg.cn/blog_migrate/c49889d5015b7c209d839e62832ff909.jpeg)
返回结果
![34473b18c61af727ae42440202b18884.png](https://i-blog.csdnimg.cn/blog_migrate/d97d0742528dfd2459f1cdfd8f4e1ef7.jpeg)
客户端模式登录演示完毕
六、总结
OAuth2登录认证方式还有很多,大家可以自己去了解