Spring Security OAuth2入门级使用(示例)
Posted justry_deng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security OAuth2入门级使用(示例)相关的知识,希望对你有一定的参考价值。
Spring Security OAuth2入门级使用(示例)
各授权模式演示
演示涉及角色说明:
- 张三 - 某用户
- 念头 - 某应用(张三要注册/登录念头)
- oauth2授权服务器(张三是oauth2的用户;如:张三是微信的用户)
- oauth2资源服务期(张三有一些资源数据存放在oauth2中;如:张三有一些基本信息数据,存储在微信)
授权码模式演示
演示步骤整体说明:
张三登录念头的首页
点击第三方登录(即:OAuth2授权服务器登录)
注:张三也是这个第三方的用户
OAuth2授权服务弹出oauth2的用户登录界面
张三使用账密完成OAuth2授权服务器登录
张三登录成功后,OAuth2授权服务弹出(念头发起的)授权申请页
张三点击授权通过
OAuth2授权服务通过配置好的回调地址,回调至念头的首页接口,传递授权码
念头首页接口成功接收到授权码
------------------------------- 念头获取oauth2的授权码结束 -------------------------------
念头接收到授权码后,马上调用OAuth2授权服务器的获取token接口
注:发起这个调用时,参数除了携带授权码,还会携带client_id、client_secret、redirect_uri等
OAuth2授权服务器通过授权码及client_id、client_secret等完成认证,并回调念头的redirect_uri地址,返回access_token等信息
念头拿到access_token
------------------------------- 念头获取oauth2的access_token结束 -------------------------------
念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
念头拿到OAuth2的资源
------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
-
admin张三
-
user李四
账密模式演示
演示步骤整体说明:
- 张三登录念头的首页
- 念头弹出输入框,让张三输入oauth2授权服务器的账号密码
- ------------------------------- 念头获取用户在oauth2账号密码 -------------------------------
- 念头拿到张三在oauth2授权服务器的账号密码,然后结合oauth2授权服务器分给自己的client_id等数据,调用oauth2授权服务器,获取到access_token等数据
- OAuth2授权服务器通过用户的账号密码及念头的client_id、client_secret等完成认证,并返回access_token等信息
- 念头拿到access_token
- ------------------------------- 念头获取oauth2的access_token结束 -------------------------------
- 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
- OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
- OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
- 念头拿到OAuth2的资源
- ------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
客户端模式演示
演示步骤整体说明:
提示:客户端模式不涉及oauth2用户
- 念头以oauth2授权服务器分给自己的client_id、client_secret等数据,调用oauth2授权服务器,获取到access_token等数据
- ------------------------------- 念头获取oauth2的access_token结束 -------------------------------
- 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
- OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
- OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
- 念头拿到OAuth2的资源
- ------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
简要模式演示
演示步骤整体说明:
张三进入念头的首页
点击第三方登录(即:OAuth2授权服务器登录)
注:张三也是这个第三方的用户
OAuth2授权服务弹出oauth2的用户登录界面
张三使用账密完成OAuth2授权服务器登录
张三登录成功后,OAuth2授权服务弹出(念头发起的)授权申请页
张三点击授权通过
OAuth2授权服务通过配置好的回调地址,回调至念头的前段页面,以uri后面的fragment的形式船体access_token等信息给念头
注:oauth2授权服务器回调念头的地址形如:
http:niantou/index#access_token=0aacde9c-7204-4b3a-b9b8-567b82d66aea&token_type=bearer&expires_in=19
,其中#access_token=0aacde9c-7204-4b3a-b9b8-567b82d66aea&token_type=bearer&expires_in=19
即为fragment念头页面成功接收到access_token等信息
注:uri中的fragment信息一般是不会传递到后端的,所以后续处理流程仍然在前端进行
------------------------------- 念头获取oauth2的access_token结束 -------------------------------
念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
念头拿到OAuth2的资源
------------------------------- 念头获取oauth2的资源信息结束 -------------------------------
注:上面的演示图的最后面,有个弹窗,那个是本人专门alert了一下fragment,来观察oauth2授权服务器回调回来传的是啥数据的
项目结构说明
提示:未罗列不重要的项
├─app-niantou ################################### 念头应用
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─ideaaedi
│ │ └─niantou
│ │ └─controller
│ │ AuthorizationCodeTestController.java # 测试授权码授权模式
│ │ ClientTestController.java # 测试客户端授权模式
│ │ ImplicitTestController.java # 测试简要授权模式
│ │ PasswordTestController.java # 测试账密授权模式
│ │
│ └─resources
│ └─templates
│ authorizationCode-index-all.html
│ authorizationCode-index-read.html
│ authorizationCode-index-write.html
│ client-index.html
│ implicit-index.html
│ password-index.html
│
├─auth-server ################################### oauth2授权服务
│ └─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─ideaaedi
│ │ └─auth_server
│ │ └─conifg
│ │ OAuth2AuthServerConfig.java # oauth2授权服务核心配置
│ │ OAuth2AuthServerExceptionHandler.java # oauth2授权异常处理器
│ │ SpringSecurityConfig.java # spring security的配置
│ │
│ └─resources
│ │
│ │ application.yml # oauth2授权 用的reids存储的token,用的db存储的客户授权详情, 需要在这里面进行相关配置
│ │
│ └─sql
│ auth_server_db.sql # 相关的sql
│
└─resource-server ################################### oauth2资源服务
└─src
└─main
├─java
└─com
└─ideaaedi
└─resource_server
├─conifg
│ OAuth2ResourceServerConfig.java # oauth2资源服务核心配置
│ SpringSecurityConfig.java # spring security的配置
│
└─controller
ResourceController.java # oauth2资源服务的资源(演示示例中,念头就是要获取这个)
授权信息表结构
提示此sql也在auth-server的resource/sql目录下
DROP TABLE IF EXISTS `oauth_client_details`;
CREATE TABLE `oauth_client_details` (
`client_id` varchar(48) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户id',
`resource_ids` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户可访问的资源id,多个使用逗号分割\\r\\n注:不涉及其它资源的访问的话,可不填',
`client_secret` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户秘钥\\r\\n注:须填写对应的密文,加密方式取决于oauth2认证服务器的加密器\\r\\n注:implicit授权模式可不填,其余授权模式必填',
`scope` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权范围',
`authorized_grant_types` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权类型,多个使用逗号分割\\r\\n(client_credentials - 客户端模式授权;password-账密模式授权;authorization_code - 授权码模式授权;implicit - 简要模式授权)\\r\\n注:需要同时再加一个refresh_token授权类型以支持刷新token, implicit模式、client_credentials模式可不加',
`web_server_redirect_uri` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'web回调地址(授权类型含authorization_code或implicit时,必填)',
`authorities` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限,多个使用逗号分割',
`access_token_validity` int(11) NULL DEFAULT NULL COMMENT 'access_token失效时长(单位s)',
`refresh_token_validity` int(11) NULL DEFAULT NULL COMMENT 'refresh_token失效时长(单位s)',
`additional_information` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '附加信息(若设置值,必须是json格式)',
`autoapprove` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`client_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
demo代码下载&运行
- 需要先启动redis(,在auth-server的配置文件中修改redis配置)
- 需要准备数据库表(,在auth-server的配置文件中修改数据库配置,sql初始化脚本在auth-server的resource/sql目录下)
- 启动三个项目(无顺序要求),然后
- 访问http://localhost:8080/nian-tou/home进行授权码模式测试
- 访问http://localhost:8080/nian-tou/namePwd进行账号密码模式测试
- 访问http://localhost:8080/nian-tou/client进行客户端模式测试
- 访问http://localhost:8080/nian-tou/implicit进行简化模式测试
相关资料
- 本文已被收录进《程序员成长笔记》 ,笔者JustryDeng
- 做微服务绕不过的 OAuth2,松哥也来和大家扯一扯
以上是关于Spring Security OAuth2入门级使用(示例)的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security OAuth2入门级使用(示例)
Spring Security 入门(1-3)Spring Security oauth2.0 指南
在测试阶段,Spring Security OAuth2 的 mvn 安装失败
SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权