java oauth2登录以及权限_Spring Cloud集成Security OAuth 2.0权限鉴权验证示例

论坛 期权论坛 脚本     
已经匿名di用户   2022-3-21 23:40   1686   0

Spring Cloud集成Security OAuth 2.0权限鉴权验证示例

一、背景说明

目前市场上微服务之间涉及到相互调用的问题,在这个过程中为了验证安全性,需要采用鉴权方式进行管理。目前主流的鉴权方式有Apache Shiro和Spring Security,在这里暂且不讨论Apache Shiro和Spring Security孰优孰劣。本文只讲解Spring Security的集成方式。同时,采用了OAuth 2.0的管理方式,主要基于Token来实现鉴权过程。

Spring Cloud提供了对Spring Security的管理以及OAuth 2.0的集成,方便了我们进行整合使用。

二、项目结构

核心组件:

6a256bf5a3902446ed22186b5a56945d.png

Api调用管理,主启动类:

6b16bcc8298c56e09db06b24767a84b0.png

依赖的jar包,父工程:

8e5859316e44955d15fc07e979a94249.png
82c62d77cf13656747ff206cf0b1b1fd.png

核心工程:

引入spring-security-oauth2-autoconfigure

7deb5919615638e2de76dfb36b0fe03f.png

Spring Security OAuth 2.0验证工具:

d726c77eca5c8e6c2b42bb0ec891efdd.png

Spring Boot与Spring Security的集成

bfc5949b9e2fe3585bfab2f6823e08a9.png

Spring Cloud管理Spring Security工具:

c17b0f4f0368d09975a326849854f66f.png

Spring Cloud管理OAuth 2.0:

32f7bfa0310f3fc379eff966f0f0ca89.png

集成Redis及JDBC:

a7a975afaf97842e26b279100caebfa8.png

Spring Social工具包:

a721d8cf798e43108aa21254e42aab2f.png

JWT工具:

38756cf0cc9a8f7578ea56d10b894519.png

API工程:引入核心工程

569aabedeee41ca388e22ebb006892e0.png

Spring Boot启动工具及AOP:

40f3be0c41a7229abc114997900516b9.png

引入Spring Boot缓存工具:

f1706e527f1642aec35b309e12eaa77c.png

三、配置资源服务和认证服务

资源服务是用来配置用户名密码及手机号验证码等相关的用户认证方式的资源过滤路径,以及静态资源路径和相关请求地址设置认证等功能。

认证服务是用来设置认证使用的方式,Redis/JWT等工具,以及客户端id(clientId)和客户端密钥(clientSecret),只有验证通过的clientId和clientSecret才能获取Token。

我们使用继承AuthorizationServerConfigurerAdapter的SsbAuthorizationServerConfig认证服务类:

b9864f2f81fe5cc0465d74e940b1fa83.png
bac33d1ac5567234e4b07db0ef154648.png

设置认证方式:

6fae206a12d64136f2eae222283cdd5c.png

过滤的静态资源文件:

d2ed7dafd46f0c82356362e900a62f4b.png

设置登录页:/form/token地址

e4e124189e2e12d1e0b6d520887e726a.png

设置手机认证及静态资源放开权限:

ba6219286dfe95b7cfd7bdb14466902c.png

四、通过用户名密码登录获取Token

我们可以正式使用Spring Security OAuth配置用户名和密码登录,也就是表单登录,Spring Security默认有Form登录和Basic登录,我们已经在SsbResourceServerConfig类的configure方法上通过http.formLogin()设置了表单登录

e35d608e0aca51bf703444ac03acbf5f.png

也就是用户名密码登录。其中Spring Security已经实现了表单登录的封装了,我们只需要设置登录成功之后返回的Token就行。我们创建一个继承SavedRequestAwareAuthenticationSuccessHandler的SsbAuthenticationSuccessHandler实现类:

ae87ef083eb0d087eb65d07055503860.png
2e487ccba2cc79f9adf8290703af0eba.png

设置OAuth Token:

b24664cc8ab3720be41a6ab4cf8b598a.png

加密工具:

1b435d0599dc74d417983f100a157b45.png

这样就可以成功的返回Token给前端,因此我们必须放开/form/token请求地址,我们已经在SsbResourceServerConfig类的configure放开了,已经设置了处理成功的ssbAuthenticationSuccessHandler方法,失败处理的ssbAuthenticationFailureHandler处理过程:

4061c72a78aa6f270e36b2851f71c35e.png

我们接下来创建基于UserDetailsService的ApiUserDetailsService类,本来应该在这个类中查询从数据库中的认证信息,在这里没有从数据库查询,代码如下:

5c3dd53bbd8cd5715d1b3d1f704f6a0e.png
9207e4e6caf765c39493bc7e6c164bbe.png

给与了admin、ROLE_USER权限

打开PostMan测试

958ef52fcbd8dae048dcd4676e1b2dd4.png

Authorization选择Basic Auth

fa1942b4e15720726271035013c0f1fb.png

填写密钥:

f6c3440e867c93d182468fb650f48923.png

密钥为

486b538ca47928e235887f2a83f2d16d.png

中设置的密钥

c076d8a5c5269eeccb64d12826f6c096.png

添加至Header

7a00735e0ed25dedfa9d8c8cc859a2d4.png

在Body中添加登录用户名、密码

fec06c6a25f551325ebd5249d98f982f.png

发送请求,返回:

811812f6cb381d1c6366cec3ce0c2c28.png

表示认证成功

五、通过手机验证码登录获取Token

首先配置Redis:

6c916b378f9a63d04a87a3471adad394.png

打开Redis:

fe362c4edda6944d414676b88ac971d8.png

创建四个使用的类:

(1)基于AbstractAuthenticationToken的SmsCodeAuthenticationToken

8587e067b61448597f766a108ece74fc.png

(2)基于AbstractAuthenticationProcessingFilter的SmsCodeAuthenticationFilter

5f1a08300d1c02f29a3d7b0b105b7103.png

(3)基于AuthenticationProvider的SmsCodeAuthenticationProvider

741eeda29addb3569daf588a8807010b.png

(4)基于SecurityConfigurerAdapter的SmsCodeAuthenticationSecurityConfig

c97dcca22258f9dc2a3ed5555260d43f.png

通过在资源管理器里面SsbResourceServerConfig添加

6d3c6bed3c5cca485d1cc7499a92682d.png

手机验证码接入

SmsCodeAuthenticationToken类的代码如下:

44e4608d800148dbd30e02cdeae43b79.png
5611dad1bd133de385bb1cc2db70eda5.png
ec9df33a177170d2980b6135da3bdcbb.png

SmsCodeAuthenticationFilter的代码如下:

f6059ebfadeeb4a2aa61aabe836a8d4b.png

添加认证逻辑

106849d0b5d51f2d8bb025a191d66ff4.png
9659d05440277a5231d592d3b2bf65bd.png
b823d65b098952c2ea2480c3777c9a60.png

SmsCodeAuthenticationProvider的代码如下:

216bf134cd573379df3b2a61ed5911aa.png
66ac5339850a894694180e85246af5b0.png
a3c5eb6983921a67cdc54ba8be755848.png

SmsCodeAuthenticationSecurityConfig的代码如下:

c7cd75995bdc47a3c4213f54e73d1fd8.png
35957460103c69ea27fa8a0af2750b94.png

接下来在PostMan里面

06dacc41685cedae1fe811b032e116c6.png

其Authorization:

6471c526e63c0e056038e5cdaffa72aa.png

添加进Header:

03d3bff5489e314cd40070bf03659607.png

其Body里面:

8a363b8252f1cd79bd4ba692423cdf2c.png

发起请求,控制台:

fbafc76be87cac322501c17de285be92.png

PostMan里面:

93f20fc6a2a74553b163decc6c709218.png

验证成功

六、将Token保存到Redis里面

改造一下SsbAuthorizationServerConfig类,添加Redis保存Token:

e4b44678c1784bf08803d9ca5dc9aac7.png

将RedisTokenStoreConfig新建一下:

b005cf4ce048f30e0f617330ecb08138.png

在application.properties添加:

cf3dbb114aebe2aa1468c00a4caf928f.png

我们测试下:

02d58b2a53e4d631abadf91f5e9e251a.png

Redis控制台:

fb4f0ffa27656309fc3ac332c730ba4d.png

已存储至Redis

七、使用JWT生成Token

改造一下SsbAuthorizationServerConfig

b5ac625ecd4432913ffcab931c1913b8.png

接着创建JwtTokenStoreConfig

1abf956103a1dfa2e8b95dadb2fe496a.png

并且需要创建一个基于Token Handler,添加Token用户信息:

696cc4db858c4359c9d3a9fb1c29c59f.png

设置一下application.properties:

afa866dab2bb51e724948ab14aa5dffe.png

测试一下

c0a5e2f41d2dd11bbc43e67382928212.png

八、本文总结

本文已经使用了Spring Security封装用户表单登录,我们需要使用手机号验证码登录只需要在此基础上集成编写即可

主要工作在SsbResourceServerConfig里面实现了

8cccc7b8ff791949e2f31e5753d3dd37.png

完成鉴权验证

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP