SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

yizhihongxing

3)OAuth2 Client 结合GitHub授权案例

本随笔说明:这仅作为OAuth2 Client初次使用的案例,所以写得很简单,有许多的不足之处。

OAuth2 Client(OAuth2客户端)是指使用OAuth2协议与授权服务器进行通信并获取访问令牌的应用程序或服务。OAuth2客户端代表最终用户(资源拥有者)向授权服务器请求授权,并使用授权后的访问令牌来访问受保护的资源服务器。

OAuth2客户端的主要任务是与授权服务器进行身份验证和授权流程,以获取访问令牌。这样,它可以使用该令牌来向资源服务器发出请求,获取和操作受保护的资源。

OAuth2客户端通常包含以下功能和组件:

  1. 客户端凭据(Client Credentials):OAuth2客户端必须拥有一个唯一的客户端凭据,包括客户端ID和客户端密钥(或密码)。这些凭据用于在与授权服务器进行通信时进行身份验证和授权。

  2. 授权请求:OAuth2客户端向授权服务器发送授权请求,包括请求的权限范围和重定向URL。它会提供自己的客户端凭据以进行身份验证。

  3. 授权回调处理:OAuth2客户端需要能够接收和处理来自授权服务器的授权回调。这是授权服务器将授权码或访问令牌传递回客户端的方式。

  4. 访问令牌的管理:OAuth2客户端负责管理访问令牌的获取、刷新和失效。它应该能够安全地存储和使用

3.1 GitHub设置

官方文档:https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app

  1. 点击自己头像/进入Settings/ 进入Developer settings(左边导航栏最下面)/ 进入OAuth Apps;然后注册新应用程序

    SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

  2. 注册新应用程序

    第一步:

    SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

    值得注意的是,如果回调地址不是/login/oauth2/code/*,仅仅是回调失败,但是授权会成功。其次就是在spring security中/login/oauth2/code是固定的,而/github是自己指定的,即最后一个是动态的。

    从spring security源码中可以看出,回调地址的固定写法:

    public class OAuth2LoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
        public static final String DEFAULT_FILTER_PROCESSES_URI = "/login/oauth2/code/*";
        private static final String AUTHORIZATION_REQUEST_NOT_FOUND_ERROR_CODE = "authorization_request_not_found";
        private static final String CLIENT_REGISTRATION_NOT_FOUND_ERROR_CODE = "client_registration_not_found";
        private ClientRegistrationRepository clientRegistrationRepository;
        private OAuth2AuthorizedClientRepository authorizedClientRepository;
        private AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository;
        private Converter<OAuth2LoginAuthenticationToken, OAuth2AuthenticationToken> authenticationResultConverter;
    
        public OAuth2LoginAuthenticationFilter(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientService authorizedClientService) {
            this(clientRegistrationRepository, authorizedClientService, "/login/oauth2/code/*");
        }
        //省略.....
    }    
    

    第二步:点击Register application后就会跳转到如下界面,这时可以创建密钥(必须)和上传应用logo(非必须)

    创建密钥时需要输入密码,得到密钥后请妥善保存,更新信息后密钥就不再显示

    在更新前可以将ClientIDClient secrets以及 回调URL 保存一下,等下会用到

    SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

3.2 开始编码

创建一个基本的springboot项目,我这里的spring boot版本是:2.7.11,所以spring security的版本是5.7以上的,可能存在语法差异

  1. spring security和oauth2 client的maven依赖

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--oauth2-client-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
    
  2. yml配置文件

    spring.security.oauth2.client.registration是固定写法,会有提示,而后面的为自定义内容,不会有提示

    server:
      port: 8080
    
    spring:
      security:
        oauth2:
          client:
            registration:
              github:
                client-id: Client ID # 自己的客户端ID
                client-secret: Client secrets # 自己的密钥
                redirect-uri: 回调URL # 必须和GitHub上填的回调地址一致
    
    
  3. SpringSecurity配置文件

    .oauth2Login()使用oauth2登录认证

    package com.yang.springsecurityoauthclient01.config;
    
    //省略导包
    
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true,jsr250Enabled = true)
    public class WebSecurityConfig {
    
        @Bean
        SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            return http.authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                    .oauth2Login()  //使用oauth2认证 (需要在配置文件中配置服务,否则可能会启动失败 )
                    .and()
                    .csrf().disable()
                    .build();
        }
    }
    
    
  4. controller 控制层编写

    package com.yang.springsecurityoauthclient01.controller;
    
    //省略导包
    
    @RestController
    public class HelloController {
    
        @GetMapping("/index")
        public String index(){
            return "主页~~~";
        }
        
        /**
         * @return GitHub的授权信息
         */
        @GetMapping("/hello")
        public DefaultOAuth2User hello(){
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            return (DefaultOAuth2User) authentication.getPrincipal();
        }
    }
    
    
  5. 最终结果

    访问http://localhost:8080/index,点击GitHub进行授权验证

    SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

    授权Authorize

    SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

    访问http://localhost:8080/hello得到授权信息:

    SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

  6. 撤销用户授权

    撤销授权后重启程序,之前的用户就需要进行重新进行授权了。

    SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

最后最后需要注意的是,同一个账号在短时间内别试得太多,不然会出现如下情况,解决办法也很简单,等就是了~~~
SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版)

原文链接:https://www.cnblogs.com/fwdba/p/17383464.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringSecurity:OAuth2 Client 结合GitHub授权案例(特简单版) - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • Mybatis 动态SQL搭建环境的全过程

    Mybatis 动态SQL是 Mybatis 框架中非常重要的一个功能,可以通过此功能来动态生成 SQL 语句,从而满足不同场景需求。下面是 Mybatis 动态SQL搭建环境的全过程的详细介绍: 1. 环境准备 需要准备以下环境: JDK Maven MySQL数据库 Mybatis IDE插件(建议使用IDEA) 2. 创建项目 使用 Maven 创建一…

    Java 2023年6月1日
    00
  • intellij idea的快速配置使用详细教程

    Intellij IDEA的快速配置使用详细教程 简介 Intellij IDEA 是一个流行的 Java 集成开发环境,具有高效可扩展、强大且智能的代码编辑器和丰富的工具集。下面是 Intellij IDEA 的快速配置使用详细教程。 步骤 下载和安装在官网 https://www.jetbrains.com/idea/ 上下载适合你的操作系统版本并安装。…

    Java 2023年5月20日
    00
  • Java实战在线选课系统的实现流程

    Java实战在线选课系统的实现流程 本文主要介绍Java实战在线选课系统的实现流程。在这个系统中,用户可以浏览课程列表、查看课程详情、选课、取消选课等操作。系统采用Java Web技术实现,包括前端使用HTML、CSS和JavaScript,后端使用Spring框架、MyBatis框架和MySQL数据库。 前端实现 前端主要实现用户界面,包括课程列表展示和课…

    Java 2023年5月24日
    00
  • Java日常练习题,每天进步一点点(31)

    让我来为你详细讲解一下“Java日常练习题,每天进步一点点(31)”这个练习题的攻略。 题目描述 该题目要求我们实现一个方法,该方法接收两个数组作为输入,然后返回两个数组中相同的元素。该方法的原型如下: public static int[] getSame(int[] arr1, int[] arr2) 思路分析 该题目的思路比较简单,我们可以通过双重循环…

    Java 2023年5月19日
    00
  • Spring循环依赖的解决办法,你真的懂了吗

    Spring循环依赖是指两个或多个Bean之间相互依赖导致Bean的初始化出现死循环的情况。这种情况下,Spring无法完成Bean的初始化,进而导致程序无法启动。在开发过程中,循环依赖是比较常见的问题。下面是解决Spring循环依赖问题的完整攻略。 1.问题描述 Bean A和Bean B相互依赖,Bean A依赖于Bean B,同时Bean B依赖于Be…

    Java 2023年5月31日
    00
  • Java实现在线考试系统与设计(学生功能)

    Java实现在线考试系统与设计(学生功能) 系统概述 在线考试系统是基于Web的应用系统,主要是为了方便学生进行在线考试。该系统可以实现学生在线测试、查看成绩等功能。此系统采用Java EE技术,使用SpringMVC框架作为基础框架,使用MyBatis作为ORM框架,使用MySQL数据库进行数据存储。 学生功能 系统设计的学生功能分为以下几个模块: 1. …

    Java 2023年5月19日
    00
  • Java中Equals使用方法汇总

    Java中Equals使用方法汇总 Equals是Java中用于比较对象的方法,常用于判断两个对象是否相等。在Java中,我们可以通过两种方式来使用Equals:覆写Equals方法和使用Objects类中的equals方法。 覆写Equals方法 覆写Equals方法是指在一个类中自定义其equals方法,这样可以根据实际需求来自定义比较方式。 Java中…

    Java 2023年5月20日
    00
  • Java基础之Maven详解

    Java基础之Maven详解 什么是Maven? Maven 是一个项目建立,依赖管理以及项目生命周期管理的工具。使用 Maven 可以很方便地构建、打包、发布和管理 Java 项目。 Maven的工作原理 Maven 的工作原理是:在项目的根目录创建一个名为 pom.xml 的文件,它是 Maven 的核心文件,其中定义了以下信息: 项目的基本信息,比如名…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部