基于spring-security-oauth2实现oauth2

Posted by wotrd on 06-17,2019

基于spring-security-oauth2实现oauth2

文章代码地址:链接描述可以下载直接运行,基于springboot2.1.5,springcloud Greenwich版本实现

该系列分为两个部分:分为内存实现,数据库实现。其中数据库实现采用RBAC权限角色管理。


首先声明oauth2是一种协议规范,spring-security-oauth2是对他的一种实现。其次,还有shiro实现,自己根据规范编写代码的实现方式。主流的qq,微信等第三方授权登录方式都是基于oauth2实现的。
oauth2的认证方式有授权码,简单,账户密码,客户端等方式,具体请自行百度不做过多的阐述。 本文基于授权码方式实现
oauth生态设计的范围很大,可以说是一种解决方案,它有“第三方客户端(web服务,APP服务)”、“用户”、“认证服务器”、“资源服务器”等部分。认证流程如下图:

s_4_1

(A)用户打开客户端以后,客户端要求用户给予授权。 (B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。


好了,简单介绍后,现在开始实现基于内存的认证服务编写:
(1)使用idea在nacos-test项目中创建authserver-memory模块。
目录如下图:

s_4_2

(2)创建好module之后,我们开始配置pom文件加载依赖。 注意:springcloud的版本1.x和2.x差别很大,有很多不兼容,例如jpa1.x的findOne方法在2.x版本中不能使用。因为我们需要先配置依赖管理

s_4_3
我把spring-cloud-Alibaba一起配置了。好了,现在添加oauth2的依赖,因为我们使用springcloud,并且springcloud-security为我们封装好了oauth2,
因次我们只添加这个依赖就可以

s_4_5

(3)依赖添加完成,下面我们开始写代码,创建config包,因为,我们认证之前需要先校验用户的账户密码是否正确,所以我们先配置WebSecurityConfig拦截:

s_4_6

在config方法里,我们在内存中,配置了两个用户,这里注意密码用了BCryptPasswordEncoder进行加密,在springboot2.x中不加密会报错的。
(4)到这里,用户验证已经完成,我们创建AuthConfig配置认证拦截处理:

s_4_7

需要添加 @EnableAuthorizationServer注解开启认证服务,注入加密用的BCryptPasswordEncoder实例。然后,配置需要认证的客户端,
这里需要细说一下,首先是client_id代表是哪个客户端也就是哪个APP或者web服务需要认证的,然后是客户端的secret秘钥需要加密,
authorizedGrantTypes授权方式指的是授权码,简单,客户端,账户密码等,这里使用的是授权码(authorization_code),然后是scopes范围,
redirectUris重定向地址,就是你的登录地址,授权后跳转的地址。

(5)配置application.properties文件:

s_4_8
很简单,不在多说,现在,我们启动应用:

s_4_9
成功,我们用这个地址进行授权访问:
http://localhost:9000/oauth/authorize?client_id=client&response_type=code
成功后,跳转到登录页面:

s_4_10

输入账户:admin 密码: 123456 点登录

s_4_11

选择approve点击Authorize认证

clipboard.png
这个code就是授权码
我们打开postman用post方式获取access_token

s_4_12
这个client就是配置的client_id,secret就是配置的secret,返回access_token

ok,基于内存的oauth2实现完成,下一篇基于数据库的实现。有问题请留言。