Springboot 实践(8)springboot集成Oauth2.0授权包,对接spring security接口

news2025/1/20 5:54:26

        此文之前,项目已经添加了数据库DAO服务接口、资源访问目录、以及数据访问的html页面,同时项目集成了spring security,并替换了登录授权页面;但是,系统用户存储代码之中,而且只注册了admin和user两个用户。在实际上线项目中,用户的数量和全限时需要不定时更改的,登录的账户也需要进行角色和失效的确认。

        为了更好的维护用户数据,更好的保护系统资源,我们引入Oauth2.0。OAuth是一个开放标准,也就是一个授权框架,使应用程序能够访问项目外的资源,允许用户在第三方应用访问存储在其他服务器上的私密资源,而在整个过程不需要提供用户名和密码给到第三方应用,可以通过提供一个令牌(token)实现该功能,采用令牌的方式可以让用户灵活的对第三方应用授权或收回权限。

1、修改醒目pom.xml文件,引入Oauth2.0 jar包,添加如下依赖:

<!--oauth2-->

<dependency>

     <groupId>org.springframework.security.oauth</groupId>

     <artifactId>spring-security-oauth2</artifactId>

     <version>2.2.1.Release</version>

 </dependency>     

<!--页面要用到的框架-->

<dependency>

     <groupId>org.springframework.boot</groupId>

     <artifactId>spring-boot-starter-thymeleaf</artifactId>

</dependency>

    添加完成之后,右键点击项目名称,弹出菜单中选择“maven”→“update project”,更新系统jar包。

2、开启@EnableAuthorizationServer注解

开启@EnableAuthorizationServer注解,该注解会自动添加OAuth2的多个endpoint。

  • /oauth/authorize:验证接口, AuthorizationEndpoint
  • /oauth/token:获取token
  • /oauth/confirm_access:用户授权
  • /oauth/error:认证失败
  • /oauth/check_token:资源服务器用来校验token
  • /oauth/token_key:jwt模式下获取公钥;位于:TokenKeyEndpoint ,通过 JwtAccessTokenConverter 访问key

继承AuthorizationServerConfigurerAdapter,配置OAuth2认证服务器,需要配置授权和Token相关的三个配置。

  • AuthorizationServerSecurityConfigurer:声明安全约束,允许那些请求可以访问和禁止访问。
  • ClientDetailsServiceConfigurer:配置独立的client客户端信息,包括授权范围、授权方式、客户端权限等。授权方式包括password、implicit、client_redentials、authorization_code四种方式,其中密码授权方式必须结合 AuthenticationManager 进行配置。
  • AuthorizationServerEndpointsConfigurer:配置授权服务器的Token存储方式、Token配置、授权模式

Token存储配置,默认使用DefaultTokenServices管理生命周期。Token存储通过配置 TokenStore,默认使用内存存储,包括一下存储方式。

  • InMemoryTokenStore 默认方式,保存在本地内存
  • JdbcTokenStore 存储数据库
  • RedisTokenStore 存储Redis,这应该是微服务下比较常用方式
  • JwtTokenStore 分布式跨域JWT存储方式

此项目采用JdbcTokenStore方式进行存储,配置文件如下:

package com.SJL.Spring.Oauth.Config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.HttpMethod;

import org.springframework.security.authentication.AuthenticationManager;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration;

import org.springframework.security.core.userdetails.UserDetailsService;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;

import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;

import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;

import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;

import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;

import org.springframework.security.oauth2.provider.ClientDetailsService;

import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;

import org.springframework.security.oauth2.provider.token.TokenStore;

import org.springframework.security.oauth2.provider.token.store.JdbcTokenStore;

@Configuration

@EnableAuthorizationServer

public class OAuthAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired

    private DataSource dataSource;

    @Autowired   

    private BCryptPasswordEncoder passwordEncoder;

    @Autowired

    private AuthenticationManager authenticationManager;

    @Autowired

    private OAuthWebSecurityConfig oauthWebSecurityConfig;

    @Override

    public void configure(final AuthorizationServerSecurityConfigurer oauthServer) throws Exception {

        oauthServer

            //客户端token调用许可

            .tokenKeyAccess("permitAll()")

            //客户端校验token访问许可

            .checkTokenAccess("permitAll()") 

            .allowFormAuthenticationForClients();       

    }

   

    //refresh_token 单独配置UserDetailsService

    @Bean

    public UserDetailsService userDetailsServiceRefresh_token() { 

        return oauthWebSecurityConfig.userDetailsService();

    } 

    @Override

    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

        endpoints 

                .tokenStore(new JdbcTokenStore(dataSource)).userDetailsService(userDetailsServiceRefresh_token())// 设置令牌

                .authenticationManager(authenticationManager);

    }

    @Bean // 声明 ClientDetails实现

    public ClientDetailsService clientDetailsService() {

        return new JdbcClientDetailsService(dataSource);

    }

   

    @Override

    public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {

        clients.withClientDetails(clientDetailsService());

    }   

}

备注:文件拷贝过程如下几个函数需要自行定义,自动生成代码中未生成代码,详细如下:

(1)sysUserMapper.findByName(username);

(2)sysUserMapper.updateUNLockedByUserId(username);

            (3)sysUserMapper.updatelockTimeByUserId(username, 0L);

  (4)sysUserMapper.updatenLockByUserId(username, 0L);

(5)sysUserService.findPermissions(username)

3、开启@EnableResourceServer注解,在服务中声明资源服务器。

打开ActionApp.java文件,添加@EnableResourceServer

(1)删除WebSecurityConfig.java文件,拷贝OAuthWebSecurityConfig.java文件

(2)配置App客户端ID和密码

打开“application.yml”文件,添加如下代码:

spring:

      security:

    oauth2:

      client:

        clientId: zrBm49l73k996cJj9471

        clientSecret: b400wT1D62 

        accessTokenUri: ${auth-server}/oauth/token

        userAuthorizationUri: ${auth-server}/oauth/authorize

        scope: all

      resource:

        userInfoUri: ${auth-server}/user  

       备注:clientIdy和clientSecret为app唯一标识码,注册在库表“oauth_client_details”中

4、获取服务令牌

上述配置采用“授权码”模式,获取令牌首先获取授权码,再用授权码换取令牌,用户使用令牌访问系统资源;

(1)获取授权码

在浏览器中输入测试地址http://localhost:2885/oauth/authorize?client_id=zrBm49l73k996cJj9471&response_type=code&redirect_uri=http://localhost:2885/assets/img

浏览器返回http://localhost:2885/assets/img?code= 56Lv8n

(2)换取令牌

利用postman的post方式,发送http://localhost:2885/oauth/token?grant_type=authorization_code&code=56Lv8n&client_id=zrBm49l73k996cJj9471&client_secret=b400wT1D62&redirect_uri=http://localhost:2885/assets/img,获取令牌,postman返回如下所示:

其中, "access_token""c334c2ab-aaf7-49c6-8ce5-f23459a6274f",就是我们获得令牌

3)利用令牌访问资源

浏览器中,输入http://localhost:2885/assets/img/%E6%B5%B7%E8%B1%9A.png?access_token=c334c2ab-aaf7-49c6-8ce5-f23459a6274f,即可访问资源,如下图所示

        到此,springboot+spring security+Oauth2.0的授权服务器和资源服务器的搭建工作就结束了。下文讲详细讲解Oauth2.0的几个重要结构文件,详细配置,以及授权错误处理,实现系统登陆的闭环测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次项目内存优化--内存泄漏

需求–内存泄漏优化&#xff0c;PSS有所下降&#xff0c; OOM率减少 主要是与某个版本作基准进行对比&#xff08;一般是最新版本的前一个版本作原数据&#xff09;&#xff0c;优化后&#xff0c;PSS有所下降&#xff0c;线上OOM率减少&#xff08;Bugly版本对比&#xff09;…

网工内推 | 数通工程师,有运营商工作经验优先

01 国育产教融合教育科技&#xff08;海南&#xff09;有限公司 招聘岗位&#xff1a;通信工程师 职责描述&#xff1a; 1、负责锐捷4/5G皮基站产品的工程交付工作&#xff0c;包括现场勘测、硬件督导、开通调测、测试优化等技术交付工作&#xff1b; 2、负责锐捷4/5G皮基站网…

【探索Linux】—— 强大的命令行工具 P.5(yum工具、git 命令行提交代码)

阅读导航 前言一、软件包管理器 yum1.yum的概念yum的基本指令使用例子 二、git 命令行提交代码总结温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0c;并且讲了有关C的一些知识&#xff0c;也学习了一些Linux的基本操作&#xff0c;也了…

I2S/PCM board-level 约束及同步(latencyskewbitsync)

I2S/PCM是典型的低速串口&#xff0c;在两个方向上分别有两组信号&#xff0c;我们已soc为视角分为soc-adif和外设audio-codec。 那么adif输入&#xff1a; sclk_i, ws_i, sdi 当然并不是三个输入信号同时有效&#xff0c;只有adif RX slave时&#xff0c;三个输入都会有效…

贷款公司精准获客,快速找到目标客户,直击获客高点!

目前&#xff0c;运营商的大数据技术正在逐步发展壮大&#xff0c;并已广泛应用于各个行业。运营商大数据市场有待发展的潜在行业发展趋势难以预料&#xff0c;整体能源规模达数万亿元。运营商大数据与三家网络运营商进行了深度战略合作&#xff0c;利用移动电信运营商的大数据…

使用coloc 进行 QTL 共定位Colocalization

GWAS找到显著信号位点后&#xff0c;需要解释显著信号位点如何影响表型。 常见的一个解释方法是共定位分析。 主流的共定位分析包括&#xff1a; 1&#xff09;GWAS和eQTL共定位&#xff1b; 2&#xff09;GWAS和sQTL共定位&#xff1b; 3&#xff09;GWAS和meQTL共定位&am…

上一个说软件测试简单的,已经被面试官问emo了···

现在已经过了 ”不会但我会学“ 就能感动面试官的时代&#xff0c;随着供需关系的变化&#xff0c;不论是对于面试官还是面试者&#xff0c;面试的成本越来越高。为了筛选到更优秀的程序员&#xff0c;面试官们可谓是绞尽了脑汁&#xff0c;”面试造火箭&#xff0c;工作拧螺丝…

PS丢失d3dcompiler_47.dll文件怎么办(附详细修复方法)

我们在安装PS等软件的时候&#xff0c;有可能安装完之后出现以下问题&#xff08;特别是win10或者win11系统&#xff09; 错误&#xff1a; 打开PS的时候出现这个错误&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失D3DCOMPILER_47.dll。尝试重新安装该程序以解决此问…

03-微信小程序常用组件-视图容器组件

微信小程序组件-视图容器 文章目录 视图容器view 视图容器案例代码 swiper 滑块视图容器案例代码indicator-color 微信小程序包含了六大组件&#xff1a; 视图容器、 基础内容、 导航、 表单、 互动和 导航。这些组件可以通过WXML和WXSS进行布局和样式设置&#xff0c;从…

CFD特性FPmarkets澳福认为了解这11种足够了

CFD在交易中很重要&#xff0c;但CFD特性很多投资者不了解&#xff0c;FPmarkets澳福认为了解这11种足够了&#xff1a; 1. 投资者通过标的资产价格价值的变化获利&#xff0c;而不拥有标的资产。 2. 差价合约交易没有固定的到期日。 3. 与期货交易类似&#xff0c;差价合约交易…

海外问卷脚本机器人哪里哪里有?是真的吗?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲海外问卷项目能不能用脚本操作&#xff1f; 最近没怎么写文章&#xff0c;确实比较忙。我本人每天至少要面对5-10个客户咨询项目&#xff0c;每隔一段时间&#xff0c;都会有人问我&#xff1a;操作海外问卷有没有脚本&a…

文字点选验证码识别(上)-YOLO位置识别

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 文章中没有代码,只有过程思路,请大家谨慎订阅。…

集简云简化流程模板,轻松实现工作流程自动化

集简云平台内置大量自动化流程模板&#xff0c;用户可以在“模板中心”搜索应用名称&#xff0c;选择适合自己的场景&#xff0c;直接使用。本期分享集简云自动化工作流程。 模板推荐 模板1&#xff1a;小鹅通新增订单后同步到seatable并更新微伴助手用户信息 集成应用&#…

redis 存储结构原理 1

关于 redis 相信大家都不陌生了&#xff0c;之前有从 0 -1 分享过 redis 的基本使用方式&#xff0c;用起来倒是都没有啥问题了&#xff0c;不过还是那句话&#xff0c;会应用之后&#xff0c;我们必须要究其原理&#xff0c;知其然知其所以然 今天我们来分享一下关于 redis 的…

【网络基础实战之路】VLAN技术在两个网段中的实际应用详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 【网络基础实战之路】基于…

Matplotlib数据可视化(五)

目录 1.绘制折线图 2.绘制散点图 3.绘制直方图 4.绘制饼图 5.绘制箱线图 1.绘制折线图 import matplotlib.pyplot as plt import numpy as np %matplotlib inline x np.arange(9) y np.sin(x) z np.cos(x) # marker数据点样式&#xff0c;linewidth线宽&#xff0c;li…

揭开区块链地址背后的故事,你需要知道的KYA

作者&#xff5c;Jason Jiang 在区块链世界中&#xff0c;除了交易还有另一个基础要素&#xff1a;地址。在欧科云链日前推出的Onchain AML合规技术方案&#xff0c;也有一个与区块链地址密切相关的概念&#xff1a;KYA&#xff08;Know Your Address&#xff0c;了解你的地址&…

[LitCTF 2023]Ping

因为直接ping会有弹窗。这里在火狐f12,然后f1选禁用javascript,然后ping 然后输入127.0.0.1;cat /flag 得到flag&#xff0c; 查看其他大佬的wp &#xff0c;这里还可以抓包。但是不知道为什么我这里的burp 用不了

数字化转型能带来哪些价值?_光点科技

随着科技的迅猛发展&#xff0c;数字化转型已成为企业和组织的一项重要战略。它不仅改变了商业模式和运营方式&#xff0c;还为各行各业带来了诸多新的机遇和价值。在这篇文章中&#xff0c;我们将探讨数字化转型所能带来的价值。 数字化转型能够显著提升效率和生产力。通过引入…

【React学习】React组件生命周期

1. 介绍 在 React 中&#xff0c;组件的生命周期是指组件从被创建到被销毁的整个过程。React框架提供了一系列生命周期方法&#xff0c;在不同的生命周期方法中&#xff0c;开发人员可以执行不同的操作&#xff0c;例如初始化状态、数据加载、渲染、更新等。一个组件的生命周期…