文章代码地址:连接描述能够下载直接运行,基于springboot2.1.5,springcloud Greenwich版本实现git
该系列分为两个部分:分为内存实现,数据库实现。其中数据库实现采用RBAC权限角色管理。github
首先声明oauth2是一种协议规范,spring-security-oauth2是对他的一种实现。其次,还有shiro实现,本身根据规范编写代码的实现方式。主流的qq,微信等第三方受权登陆方式都是基于oauth2实现的。
oauth2的认证方式有受权码,简单,帐户密码,客户端等方式,具体请自行百度不作过多的阐述。 本文基于受权码方式实现
oauth生态设计的范围很大,能够说是一种解决方案,它有“第三方客户端(web服务,APP服务)”、“用户”、“认证服务器”、“资源服务器”等部分。认证流程以下图: web
(A)用户打开客户端之后,客户端要求用户给予受权。
(B)用户赞成给予客户端受权。spring
(C)客户端使用上一步得到的受权,向认证服务器申请令牌。数据库
(D)认证服务器对客户端进行认证之后,确认无误,赞成发放令牌。springboot
(E)客户端使用令牌,向资源服务器申请获取资源。服务器
(F)资源服务器确认令牌无误,赞成向客户端开放资源。微信
好了,简单介绍后,如今开始实现基于内存的认证服务编写:
(1)使用idea在nacos-test项目中建立authserver-memory模块。
目录以下图: app
(2)建立好module以后,咱们开始配置pom文件加载依赖。
注意:springcloud的版本1.x和2.x差异很大,有不少不兼容,例如jpa1.x的findOne方法在2.x版本中不能使用。由于咱们须要先配置依赖管理 ide
我把spring-cloud-Alibaba一块儿配置了。好了,如今添加oauth2的依赖,由于咱们使用springcloud,而且springcloud-security为咱们封装好了oauth2,
因次咱们只添加这个依赖就能够
(3)依赖添加完成,下面咱们开始写代码,建立config包,由于,咱们认证以前须要先校验用户的帐户密码是否正确,因此咱们先配置WebSecurityConfig拦截:
在config方法里,咱们在内存中,配置了两个用户,这里注意密码用了BCryptPasswordEncoder进行加密,在springboot2.x中不加密会报错的。
(4)到这里,用户验证已经完成,咱们建立AuthConfig配置认证拦截处理:
须要添加 @EnableAuthorizationServer注解开启认证服务,注入加密用的BCryptPasswordEncoder实例。而后,配置须要认证的客户端,
这里须要细说一下,首先是client_id表明是哪一个客户端也就是哪一个APP或者web服务须要认证的,而后是客户端的secret秘钥须要加密,
authorizedGrantTypes受权方式指的是受权码,简单,客户端,帐户密码等,这里使用的是受权码(authorization_code),而后是scopes范围,
redirectUris重定向地址,就是你的登陆地址,受权后跳转的地址。
(5)配置application.properties文件:
很简单,不在多说,如今,咱们启动应用:
成功,咱们用这个地址进行受权访问:
http://localhost:9000/oauth/authorize?client_id=client&response_type=code
成功后,跳转到登陆页面:
输入帐户:admin 密码: 123456 点登陆
选择approve点击Authorize认证
这个code就是受权码
咱们打开postman用post方式获取access_token
这个client就是配置的client_id,secret就是配置的secret,返回access_token
ok,基于内存的oauth2实现完成,下一篇基于数据库的实现。有问题请留言。