当前位置: 首页 > news >正文

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

        此文之前,项目已经添加了数据库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的几个重要结构文件,详细配置,以及授权错误处理,实现系统登陆的闭环测试。

相关文章:

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

此文之前&#xff0c;项目已经添加了数据库DAO服务接口、资源访问目录、以及数据访问的html页面&#xff0c;同时项目集成了spring security&#xff0c;并替换了登录授权页面&#xff1b;但是&#xff0c;系统用户存储代码之中&#xff0c;而且只注册了admin和user两个用户。在…...

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…...

leetcode原题 后继者:找出二叉搜索树中指定节点的“下一个”节点

题目&#xff1a; 设计一个算法&#xff0c;找出二叉搜索树中指定节点的“下一个”节点&#xff08;也即中序后继&#xff09;。 如果指定节点没有对应的“下一个”节点&#xff0c;则返回null。 示例&#xff1a; 输入: root [2,1,3], p 1 2 / \ 1 3 输出: 2 解题思路…...

pyqt5 QlineEdit 如何设置只能输入数字

在 PyQt&#xff08;Python中的一个GUI库&#xff09;中&#xff0c;可以使用QLineEdit小部件的setValidator()方法来限制用户输入的内容。要让QLineEdit只能输入数字&#xff0c;你可以使用QIntValidator或QDoubleValidator。下面是一个示例代码&#xff0c;展示如何设置只能输…...

ubuntu中安装python

最简单方便的是 apt 使用第三方的 ppa 源&#xff0c;然后直接 apt 安装 python3.9 安装 software-properties-common 获取add-apt-repository命令&#xff1a;apt install -y software-properties-common添加第三方的 ppa 源&#xff1a;add-apt-repository ppa:deadsnakes/p…...

LeetCode150道面试经典题-- 快乐数(简单)

1.题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&am…...

科研论文配图----第一章笔记

第一章笔记 科研论文的绘制基础 科研论文配图的分类与构成 根据呈现方式&#xff0c;科研论文配图可分为线性图、灰度图、照片彩图和综合配图 4 种类型。 其中&#xff0c;线性图是主要和常用的配图类型&#xff0c;也是本书重点介绍的配图类型。 科研论文配图的格式和尺寸 格…...

OpenHarmony Meetup 广州站 OpenHarmony正当时—技术开源

招募令 OpenHarmony Meetup 广州站 火热招募中&#xff0c;等待激情四射的开发者&#xff0c;线下参与OpenHarmonyMeetup线下交流 展示前沿技术、探讨未来可能、让你了解更多专属OpenHarmony的魅力 线下参与&#xff0c;先到先得,仅限20个名额&#xff01; 报名截止时间8月23日…...

如何使用PHP Smarty模板实现静态页面生成

首先&#xff0c;你需要从Smarty官网下载这个神奇的文件。然后&#xff0c;你需要在你的PHP文件中引入Smarty类。就像这样&#xff1a; require_once(Smarty.class.php);现在&#xff0c;我们要创建一个Smarty实例。这就像打开一个新的文件&#xff0c;只不过这个文件是可以和…...

【 Cocos Creator 项目实战】益智游戏《2048》(附带完整源码工程)

本文乃Siliphen原创&#xff0c;转载请注明出处 目录 游戏介绍 概述 游戏整体流程 游戏框架设计 主要流程控制类 本文项目的代码组织结构 构建游戏世界 数字方块 地图 触摸手势识别 防触摸抖动 判断用户输入的方向 地图 任意大小的地图 初始化地图大小 地图绘制…...

剑指Offer68-II.二叉树的最近公共祖先 C++

1、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…...

【JAVA】我们该如何规避代码中可能出现的错误?(一)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言三种类型的异常异常处理JAVA内置异常类Exception 类的层次 前言 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的&…...

openLayers实战(八):坐标系及其转换

坐标系介绍 EPSG: 3857 --web地图&#xff0c;基于球体的、web墨卡托投影&#xff08;伪墨卡托投影Pseudo-Mercator&#xff09;的投影坐标系&#xff0c;范围为纬度85度以下&#xff0c;由于google地图最先使用而成为事实标准。至今&#xff0c;大多互联网地图都使用EPSG3857&…...

DAY06_SpringBoot—简介基础配置yaml多环境开发配置整合第三方技术

目录 一 SpringBoot简介1. 入门案例问题导入1.1 入门案例开发步骤1.2 基于SpringBoot官网创建项目1.3 SpringBoot项目快速启动 2. SpringBoot概述问题导入2.1 起步依赖2.2 辅助功能 二 基础配置1. 配置文件格式问题导入1.1 修改服务器端口1.2 自动提示功能消失解决方案1.3 Spri…...

无涯教程-Perl - setpwent函数

描述 此功能将枚举设置(或重置)到密码条目集的开头。应该在第一次调用getpwent之前调用此函数。 语法 以下是此函数的简单语法- setpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $passwd, $uid, $gid, $quota, …...

代码随想录-数组篇

2-二分查找 方法一&#xff1a; 左闭右闭&#xff0c;[left, right] class Solution { public:int search(vector<int>& nums, int target) {//[left, right]int left 0;int right nums.size() - 1 ;while(left < right){int middle left ((right - left)…...

vue3+element-plus表格默认排序default-sort失效问题

场景 在使用动态数据渲染的场景&#xff0c;el-table设置默认属性default-sort失效。 原因 el-table的default-sort属性是针对静态数据的&#xff0c;如果是动态数据&#xff0c;default-sort则无法监听到。 案例&#xff1a;静态数据 <template><el-table:data&…...

CH32V203 单片机 I2C 使用

CH32V203系列是基于32位RISC-V内核设计的工业级增强型低功耗通用微控制器&#xff0c;高性能&#xff0c;最高支持144MHz系统主频&#xff0c;低功耗&#xff0c;运行功耗低至45uA/MHz。CH32V203集成双路USB接口&#xff0c;支持USB Host主机及USB Device设备功能&#xff0c;具…...

链表OJ题

今天讲一些关于链表的Oj题&#xff0c;相信你看完对链表又提升一个档次。 题目一 思路一 遍历一遍链表是Val值得时候free这个&#xff0c;然后我们往后走&#xff0c;一直走到末尾空指针得时候&#xff0c;新链表就是我们得答案&#xff0c;那我们用代码来表示一下吧。 struct…...

Llama 2免费托管及API提供

Llama 2 是 Meta 最新的文本生成模型&#xff0c;目前其性能优于所有开源替代方案。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、强大的Llama 2 它击败了 Falcon-40B&#xff08;之前最好的开源基础模型&#xff09;&#xff0c;与 GPT-3.5 相当&#xff0c;仅低…...

5分钟快速上手Sonar CNES Report:让代码质量报告变得简单高效

5分钟快速上手Sonar CNES Report&#xff1a;让代码质量报告变得简单高效 【免费下载链接】sonar-cnes-report Generates analysis reports from SonarQube web API. 项目地址: https://gitcode.com/gh_mirrors/so/sonar-cnes-report 你是否经历过这样的场景&#xff1f…...

连接器选型五大雷区:从故障数据到设计落地的实战手册

许多硬件团队的失效分析报告显示&#xff0c;连接器引发的现场故障占比长期居高不下&#xff0c;且症状极其隐蔽——间歇性黑屏、信号丢包、热插拔烧毁……这些问题往往在原型测试阶段难以复现&#xff0c;直到批量出货后才集中爆发。本文从电源、高速信号、射频三类典型应用出…...

Illustrator智能对象替换引擎:企业级设计自动化的技术杠杆

Illustrator智能对象替换引擎&#xff1a;企业级设计自动化的技术杠杆 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 技术价值宣言 在数字设计工业化时代&#xff0c;品牌资产管理…...

Get-cookies.txt-LOCALLY:浏览器Cookie本地导出终极指南

Get-cookies.txt-LOCALLY&#xff1a;浏览器Cookie本地导出终极指南 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在数字时代&#xff0c;浏览器…...

learn claude code S12 Worktree 任务隔离详解笔记

S12 Worktree 任务隔离详解笔记基于 s12_worktree_task_isolation.py 源码逐行分析&#xff0c;配合 s12-worktree-task-isolation.md 设计思路。一、问题&#xff1a;多个任务共享一个工作目录&#xff0c;互相踩踏 前面 11 章的 agent 都在同一个工作目录下操作。当只有一个 …...

分形超材料实现电磁波绕障传输:原理、实验与射频应用

1. 项目概述&#xff1a;让信号“穿墙”的隐身斗篷如果你看过《星际迷航》&#xff0c;肯定对克林贡人或罗慕伦人的隐形装置印象深刻&#xff0c;它能让整艘飞船从雷达上消失。虽然我们还没法让宏观物体真正“隐形”&#xff0c;但在电磁波的世界里&#xff0c;让信号“无视”一…...

Helm 2到Helm 3迁移实战:深入解析helm-2to3插件原理与操作指南

1. 项目概述与背景 如果你和我一样&#xff0c;在Kubernetes生态里摸爬滚打了几年&#xff0c;那你一定对Helm这个“包管理器”又爱又恨。爱的是它用声明式的Chart把复杂的应用部署变得像 helm install 一样简单&#xff1b;恨的是版本升级带来的“阵痛”&#xff0c;尤其是从…...

清华大学:Token消费学研究报告(附完整报告下载)

清华大学发布Token消费学研究报告&#xff0c;指出Token已演变为企业经营AI的核心资源单位。报告从供给侧和需求侧分析Token的经济学角色&#xff0c;揭示五大消费驱动机制&#xff0c;标志着AI管理进入精细化经营时代。关注GIS极客公众号&#xff0c;回复“清华Token”获取完整…...

VMware 17 Pro 中 Ubuntu 虚拟机共享 Windows 文件夹(完美踩坑版)

前言 很多小伙伴在使用 VMware 虚拟机时&#xff0c;都会遇到一个头疼的问题&#xff1a;如何在主机和虚拟机之间快速传递文件&#xff1f; 使用 U 盘拷贝&#xff1f;来回插拔太麻烦&#xff1b;用 scp 命令传文件&#xff1f;对于新手来说又有点门槛。其实&#xff0c;VMware…...

032随机链表的复制

随机链表的复制 题目链接&#xff1a;https://leetcode.cn/problems/copy-list-with-random-pointer/description/?envTypestudy-plan-v2&envIdtop-100-liked 我的解答&#xff1a; public Node copyRandomList(Node head) {Node dummy new Node(-1);Node curhead, newCu…...