1. 首页
  2. >
  3. 编程技术
  4. >
  5. Java

Spring Cloud项目OAuth2授权验证终极必杀技

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项目OAuth2授权验证终极必杀技


指定了Spring Cloud项目的基本依赖

在Pom.xml文件,引入需要的配置及工具

Spring Cloud项目OAuth2授权验证终极必杀技


在子工程,构建Spring Boot Web工程:


Spring Cloud项目OAuth2授权验证终极必杀技


引入OAuth2核心依赖:


Spring Cloud项目OAuth2授权验证终极必杀技


引入Redis作为Token的存储介质:


Spring Cloud项目OAuth2授权验证终极必杀技


引入MySQL作为客户端登录需要的配置密钥:


Spring Cloud项目OAuth2授权验证终极必杀技


引入JDBC:


Spring Cloud项目OAuth2授权验证终极必杀技


引入Swagger:


Spring Cloud项目OAuth2授权验证终极必杀技


引入前端组件:


Spring Cloud项目OAuth2授权验证终极必杀技


至此,工程构建完毕!

四、主工程模块介绍

打开application.yml,配置客户端登录标识:


Spring Cloud项目OAuth2授权验证终极必杀技


主工程结果返回实体:


Spring Cloud项目OAuth2授权验证终极必杀技


指定用户实体类,Spring Security用户类:


Spring Cloud项目OAuth2授权验证终极必杀技


配置客户端属性工具:


Spring Cloud项目OAuth2授权验证终极必杀技


配置客户端密钥:


Spring Cloud项目OAuth2授权验证终极必杀技


指定授权码模式登录之后的页面:


Spring Cloud项目OAuth2授权验证终极必杀技


指定OAuth2配置验证实体类:


Spring Cloud项目OAuth2授权验证终极必杀技


指定授权码登录跳转的处理页面:


Spring Cloud项目OAuth2授权验证终极必杀技


指定授权确认页面:


Spring Cloud项目OAuth2授权验证终极必杀技


指定用户验证实体UserDetailService:


Spring Cloud项目OAuth2授权验证终极必杀技


其中loadUserByUsername为验证用户的工具:


Spring Cloud项目OAuth2授权验证终极必杀技


找出用户实体

4.1 OAuth2核心处理工具

设置允许的请求方式:


Spring Cloud项目OAuth2授权验证终极必杀技


指定认证服务器:


Spring Cloud项目OAuth2授权验证终极必杀技


设置允许的安全认证方式:


Spring Cloud项目OAuth2授权验证终极必杀技


设置认证方式及支持的Token存储时间:


Spring Cloud项目OAuth2授权验证终极必杀技


设置令牌处理服务器:


Spring Cloud项目OAuth2授权验证终极必杀技


指定WebSecurity的处理逻辑:


Spring Cloud项目OAuth2授权验证终极必杀技


指定登录页及Token请求地址:


Spring Cloud项目OAuth2授权验证终极必杀技


五、运行代码看效果

5.1密码模式登录

打开PostMan输入地址:

http://localhost:4761/token/getToken

输入用户用户名密码:


Spring Cloud项目OAuth2授权验证终极必杀技


指定了授权类型为密码模式

返回结果:


Spring Cloud项目OAuth2授权验证终极必杀技


用户名密码模式验证成功

5.2Refresh Token模式

将步骤一里面的返回参数refresh_token取出来作为入参,修改登录模式为刷新模式


Spring Cloud项目OAuth2授权验证终极必杀技


依然是调用

http://localhost:4761/token/getToken

返回结果:


Spring Cloud项目OAuth2授权验证终极必杀技


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

返回结果进入统一认证中心:


Spring Cloud项目OAuth2授权验证终极必杀技


输入账号:admin/123456

链接中拿到了code


Spring Cloud项目OAuth2授权验证终极必杀技


用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


Spring Cloud项目OAuth2授权验证终极必杀技


返回结果拿到了Token

5.4客户端模式登录

打开PostMan选用Post方式,url:

http://127.0.0.1:4761/oauth/token


Spring Cloud项目OAuth2授权验证终极必杀技


返回结果


Spring Cloud项目OAuth2授权验证终极必杀技


客户端模式登录演示完毕

六、总结


OAuth2登录认证方式还有很多,大家可以自己去了解