Spring Security OAuth2入门级使用(示例)

Posted justry_deng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security OAuth2入门级使用(示例)相关的知识,希望对你有一定的参考价值。

Spring Security OAuth2入门级使用(示例)

各授权模式演示

演示涉及角色说明:

  • 张三 - 某用户
  • 念头 - 某应用(张三要注册/登录念头)
  • oauth2授权服务器(张三是oauth2的用户;如:张三是微信的用户)
  • oauth2资源服务期(张三有一些资源数据存放在oauth2中;如:张三有一些基本信息数据,存储在微信)

授权码模式演示

演示步骤整体说明:

  1. 张三登录念头的首页

  2. 点击第三方登录(即:OAuth2授权服务器登录)

    注:张三也是这个第三方的用户

  3. OAuth2授权服务弹出oauth2的用户登录界面

  4. 张三使用账密完成OAuth2授权服务器登录

  5. 张三登录成功后,OAuth2授权服务弹出(念头发起的)授权申请页

  6. 张三点击授权通过

  7. OAuth2授权服务通过配置好的回调地址,回调至念头的首页接口,传递授权码

  8. 念头首页接口成功接收到授权码

  9. ------------------------------- 念头获取oauth2的授权码结束 -------------------------------

  10. 念头接收到授权码后,马上调用OAuth2授权服务器的获取token接口

    注:发起这个调用时,参数除了携带授权码,还会携带client_id、client_secret、redirect_uri等

  11. OAuth2授权服务器通过授权码及client_id、client_secret等完成认证,并回调念头的redirect_uri地址,返回access_token等信息

  12. 念头拿到access_token

  13. ------------------------------- 念头获取oauth2的access_token结束 -------------------------------

  14. 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源

  15. OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息

  16. OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头

  17. 念头拿到OAuth2的资源

  18. ------------------------------- 念头获取oauth2的资源信息结束 -------------------------------

  • admin张三

  • user李四

账密模式演示

演示步骤整体说明:

  1. 张三登录念头的首页
  2. 念头弹出输入框,让张三输入oauth2授权服务器的账号密码
  3. ------------------------------- 念头获取用户在oauth2账号密码 -------------------------------
  4. 念头拿到张三在oauth2授权服务器的账号密码,然后结合oauth2授权服务器分给自己的client_id等数据,调用oauth2授权服务器,获取到access_token等数据
  5. OAuth2授权服务器通过用户的账号密码及念头的client_id、client_secret等完成认证,并返回access_token等信息
  6. 念头拿到access_token
  7. ------------------------------- 念头获取oauth2的access_token结束 -------------------------------
  8. 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
  9. OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
  10. OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
  11. 念头拿到OAuth2的资源
  12. ------------------------------- 念头获取oauth2的资源信息结束 -------------------------------

客户端模式演示

演示步骤整体说明:

提示:客户端模式不涉及oauth2用户

  1. 念头以oauth2授权服务器分给自己的client_id、client_secret等数据,调用oauth2授权服务器,获取到access_token等数据
  2. ------------------------------- 念头获取oauth2的access_token结束 -------------------------------
  3. 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源
  4. OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息
  5. OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头
  6. 念头拿到OAuth2的资源
  7. ------------------------------- 念头获取oauth2的资源信息结束 -------------------------------

简要模式演示

演示步骤整体说明:

  1. 张三进入念头的首页

  2. 点击第三方登录(即:OAuth2授权服务器登录)

    注:张三也是这个第三方的用户

  3. OAuth2授权服务弹出oauth2的用户登录界面

  4. 张三使用账密完成OAuth2授权服务器登录

  5. 张三登录成功后,OAuth2授权服务弹出(念头发起的)授权申请页

  6. 张三点击授权通过

  7. 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

  8. 念头页面成功接收到access_token等信息

    注:uri中的fragment信息一般是不会传递到后端的,所以后续处理流程仍然在前端进行

  9. ------------------------------- 念头获取oauth2的access_token结束 -------------------------------

  10. 念头拿到access_token后,马上调用OAuth2资源服务器的获取用户资源

  11. OAuth2资源服务器接收到念头传过来的access_token后,调用OAuth2授权服务器,完成token核对,并获取到相关权限信息

  12. OAuth2资源服务器根据权限信息,完成鉴权,通过鉴权后,返回资源数据给念头

  13. 念头拿到OAuth2的资源

  14. ------------------------------- 念头获取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代码下载&运行

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进行简化模式测试

相关资料

以上是关于Spring Security OAuth2入门级使用(示例)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security OAuth2入门级使用(示例)

Spring Security 入门(1-3)Spring Security oauth2.0 指南

Spring security OAuth2 深入解析

在测试阶段,Spring Security OAuth2 的 mvn 安装失败

SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

Spring Security入门Demo