Spring Cloud集成Security OAuth 2.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的集成,方便了我们进行整合使用。

二、项目结构

核心组件:


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


Api调用管理,主启动类:


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


依赖的jar包,父工程:


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


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


核心工程:

引入spring-security-oauth2-autoconfigure


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


Spring Security OAuth 2.0验证工具:


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


Spring Boot与Spring Security的集成


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


Spring Cloud管理Spring Security工具:


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


Spring Cloud管理OAuth 2.0:


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


集成Redis及JDBC:


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


Spring Social工具包:


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


JWT工具:


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


API工程:引入核心工程


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


Spring Boot启动工具及AOP:


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


引入Spring Boot缓存工具:


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


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

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

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

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


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


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


设置认证方式:


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


过滤的静态资源文件:


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


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


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


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


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


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

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


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


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


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


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


设置OAuth Token:


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


加密工具:


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


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


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


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


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


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


给与了admin、ROLE_USER权限

打开PostMan测试


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


Authorization选择Basic Auth


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


填写密钥:


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


密钥为


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


中设置的密钥


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


添加至Header


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


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


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


发送请求,返回:


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


表示认证成功

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

首先配置Redis:


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


打开Redis:


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


创建四个使用的类:

(1)基于AbstractAuthenticationToken的SmsCodeAuthenticationToken


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


(2)基于AbstractAuthenticationProcessingFilter的SmsCodeAuthenticationFilter


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


(3)基于AuthenticationProvider的SmsCodeAuthenticationProvider


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


(4)基于SecurityConfigurerAdapter的SmsCodeAuthenticationSecurityConfig


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


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


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


手机验证码接入

SmsCodeAuthenticationToken类的代码如下:


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


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


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


SmsCodeAuthenticationFilter的代码如下:


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


添加认证逻辑


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


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


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


SmsCodeAuthenticationProvider的代码如下:


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


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


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


SmsCodeAuthenticationSecurityConfig的代码如下:


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


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


接下来在PostMan里面


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


其Authorization:


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


添加进Header:


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


其Body里面:


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


发起请求,控制台:


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


PostMan里面:


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


验证成功

六、将Token保存到Redis里面

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


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


将RedisTokenStoreConfig新建一下:


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


在application.properties添加:


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


我们测试下:


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


Redis控制台:


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


已存储至Redis

七、使用JWT生成Token

改造一下SsbAuthorizationServerConfig


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


接着创建JwtTokenStoreConfig


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


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


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


设置一下application.properties:


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


测试一下


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


八、本文总结

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

主要工作在SsbResourceServerConfig里面实现了


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


完成鉴权验证


分享到:


相關文章: