oauth2密码方式的登录如何用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依赖仓库坐标

4e0f7ba6cb5dcfd7e8e069aebebf5473.png

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

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

c65542ac4cfaff7fc7a48b558fe94f0c.png

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

e2d57ebe45a64ff9a374026e2abb132c.png

引入OAuth2核心依赖:

5e3d05709bdab855ea8c12661452da1b.png

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

5b9a6752a060a854bfc8c40cbb7c5d92.png

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

10039f29e80b580993c0243cdd0a5a56.png

引入JDBC:

273dd41c0de1945c67017222a8a90598.png

引入Swagger:

3b4ff7190803f944c03c205a7f5bd8d8.png

引入前端组件:

7d77c4384bcc939e9121545b00ff3c42.png

至此,工程构建完毕!

四、主工程模块介绍

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

2845dab8d497fb658d4c751f7ccef2c0.png

主工程结果返回实体:

18681586cf5a7fe7eb92b483c5eaff1d.png

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

281d30a134ede1a403510958f066d5d7.png

配置客户端属性工具:

a673d933064d7c93d4afd4b595834fba.png

配置客户端密钥:

e0d4bdef274ee50f146f77114e011986.png

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

79b70b6698fbfd9547cbc9be13345036.png

指定OAuth2配置验证实体类:

0075a515a02215219fc9a420574e4749.png

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

c285ed8e150f248bf17c7b1de93ac275.png

指定授权确认页面:

beafda276de55f2022d0199e11f95c06.png

指定用户验证实体UserDetailService:

f92d39bd6d2493a070db76567ffdebd7.png

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

45d8a55529341ed06111d9d69a18d930.png

找出用户实体

4.1 OAuth2核心处理工具

设置允许的请求方式:

bb66d0727c82c6aabf8e9293bd2df436.png

指定认证服务器:

abf704d1254c8ef2c11dc0c7dcbedfac.png

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

35d3217d314a1d17d4540eac0b7440f4.png

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

1341a8cf2b59cacd3ab8d12b438bd792.png

设置令牌处理服务器:

f678de7581c9a0e9af3c3ca01dd97927.png

指定WebSecurity的处理逻辑:

d17bc31ccf4b653290574c1ebc80eecc.png

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

1bd871ab72be5c7c7421bb124f741869.png

五、运行代码看效果

5.1密码模式登录

打开PostMan输入地址:

http://localhost:4761/token/getToken

输入用户用户名密码:

b7b17b3ea05f0aafee08992ebfd13878.png

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

返回结果:

6f92bdb574569f55016c64e8555ff5bf.png

用户名密码模式验证成功

5.2Refresh Token模式

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

f2b3450a9fce421fd6d5508c963790c0.png

依然是调用

http://localhost:4761/token/getToken

返回结果:

7e5fac5304ac06abd2354e70a51baa92.png

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

输入账号:admin/123456

链接中拿到了code

dd8f5093cb05cffce6e08d8898594492.png

用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

返回结果拿到了Token

5.4客户端模式登录

打开PostMan选用Post方式,url:

http://127.0.0.1:4761/oauth/token

e11ed847d1ae31815025275c8388f0f7.png

返回结果

34473b18c61af727ae42440202b18884.png

客户端模式登录演示完毕

六、总结

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值