基于 spring-security-oauth2 实现 oauth2
文章代码地址:链接描述可以下载直接运行,基于 springboot2.1.5,springcloud Greenwich 版本实现
该系列分为两个部分:分为内存实现,数据库实现。其中数据库实现采用 RBAC 权限角色管理。
首先声明 oauth2 是一种协议规范,spring-security-oauth2 是对他的一种实现。其次,还有 shiro 实现,自己根据规范编写代码的实现方式。主流的 qq,微信等第三方授权登录方式都是基于 oauth2 实现的。
oauth2 的认证方式有授权码,简单,账户密码,客户端等方式,具体请自行百度不做过多的阐述。本文基于授权码方式实现
oauth 生态设计的范围很大,可以说是一种解决方案,它有“第三方客户端(web 服务,APP 服务)”、“用户”、“认证服务器”、“资源服务器”等部分。认证流程如下图:
(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
好了,简单介绍后,现在开始实现基于内存的认证服务编写:
(1)使用 idea 在 nacos-test 项目中创建 authserver-memory 模块。
目录如下图:
(2)创建好 module 之后,我们开始配置 pom 文件加载依赖。
注意:springcloud 的版本 1.x 和 2.x 差别很大,有很多不兼容,例如 jpa1.x 的 findOne 方法在 2.x 版本中不能使用。因为我们需要先配置依赖管理
我把 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 实现完成,下一篇基于数据库的实现。有问题请留言。