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依赖仓库坐标
指定了Spring Cloud项目的基本依赖
在Pom.xml文件,引入需要的配置及工具
在子工程,构建Spring Boot Web工程:
引入OAuth2的核心依赖:
引入Redis作为Token的存储介质:
引入MySQL作为客户端登录需要的配置密钥:
引入JDBC:
引入Swagger:
引入前端组件:
至此,工程构建完毕!
四、主工程模块介绍
打开application.yml,配置客户端登录标识:
主工程结果返回实体:
指定用户实体类,Spring Security用户类:
配置客户端属性工具:
配置客户端密钥:
指定授权码模式登录之后的页面:
指定OAuth2配置验证实体类:
指定授权码登录跳转的处理页面:
指定授权确认页面:
指定用户验证实体UserDetailService:
其中loadUserByUsername为验证用户的工具:
找出用户实体
4.1 OAuth2核心处理工具
设置允许的请求方式:
指定认证服务器:
设置允许的安全认证方式:
设置认证方式及支持的Token存储时间:
设置令牌处理服务器:
指定WebSecurity的处理逻辑:
指定登录页及Token请求地址:
五、运行代码看效果
5.1密码模式登录
打开PostMan输入地址:
http://localhost:4761/token/getToken
输入用户用户名密码:
指定了授权类型为密码模式
返回结果:
用户名密码模式验证成功
5.2Refresh Token模式
将步骤一里面的返回参数refresh_token取出来作为入参,修改登录模式为刷新模式
依然是调用
http://localhost:4761/token/getToken
返回结果:
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
返回结果进入统一认证中心:
输入账号:admin/123456
链接中拿到了code
用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
返回结果拿到了Token
5.4客户端模式登录
打开PostMan选用Post方式,url:
http://127.0.0.1:4761/oauth/token
返回结果
客户端模式登录演示完毕
六、总结
OAuth2登录认证方式还有很多,大家可以自己去了解
本文暂时没有评论,来添加一个吧(●'◡'●)