spring-security-oauth2实现OAuth2.0服务

Spring Boot整合OAuth2,附详细注释 **授权服务器配置@author 向振华*/@Autowired@Autowired@Autowired@Autowired/**配置令牌端点(内置的/oauth/* 接口)的安全约束*/@Overridesecurity// 允许访问/oauth/token授权接口// 开启/oauth/check_token访问/**配置客户端详情*/@Override// 读DB客户端详情// 客户端详情配置。 阅读详情

关于OAuth的介绍查看我的另一篇文章OAuth的4种授权方式,spring-security-oauth2是实现OAuth2.0的框架,配置稍微有些繁琐,因此本文记录下大概的思路,加深印象。

OAuth 2.0中主要有Authorization Service授权服务和Resource Service资源服务,他们可以在同一个应用程序中,也可以在两个应用程序中,甚至多个资源服务共享一个授权服务。

spring-security提供了相应的endpoints来管理token的请求,/oauth/authorize端点负责授权服务,/oauth/token端点负责token的请求服务;资源服务中的过滤器OAuth2AuthenticationProcessingFilter 负责校验Token。

下面从总体上介绍授权服务和资源服务的主要配置,详细的配置在githubspring-security-oauth demo上。

授权服务配置


@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    private static final String DEMO_RESOURCE_ID = "openapi";

    @Autowired
    private OrderAuthProperties orderAuthProperties;

    /**
     * 注意这里AuthenticationManager和UserAccountService
     * 是在SecurityConfiguration配置的,把俩个配置类关联了起来
     */
    @Autowired
    AuthenticationManager authenticationManager;
    @Autowired
    private UserAccountService userAccountService;

    @Autowired
    private AuthorizationCodeServices authorizationCodeServices;

    @Autowired
    RedisConnectionFactory redisConnectionFactory;

    @Autowired
    private OAuthClientDetailsService oAuthClientDetailsService;

    @Autowired
    private DataSource dataSource;

    /**
     * 配置第三方客户端的信息,可以从内存中加载,也可以从数据库加载(更常用)
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
        clients.withClientDetails(oAuthClientDetailsService);

        // 这里将第三方客户端放到内存里,配置两个客户端,一个用于client认证
//        clients.inMemory()
//                .withClient("client_1")
//                .resourceIds(DEMO_RESOURCE_ID)
//                .authorizedGrantTypes("client_credentials", "refresh_token")
//                .scopes("select")
//                .authorities("client")
//                .secret("123456")
//                .and().withClient("client_2")
//                .secret("123456")
//                .resourceIds(DEMO_RESOURCE_ID)
//                .authorizedGrantTypes("authorization_code", "code", "password", "refresh_token")
//                .scopes("select")
//                .redirectUris("http://www.baidu.com");
    }


    /**
     * 定义token endpoint的安全配置
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
        oauthServer
                .realm("oauth2-resources")
                .tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()")
                .passwordEncoder(clientPasswordEncoder())
                .allowFormAuthenticationForClients();
    }

    /**
     * 第三方客户端使用加密方式
     */
    @Bean
    public PasswordEncoder clientPasswordEncoder() {
        // 不做加密处理,明文存储
        return NoOpPasswordEncoder.getInstance();
    }

    /**
     * 定义授权、token endpoint和token服务,即如何生成token和token存储在哪里(内存/数据库/JWT)
     *
     * <p>
     * 这里最重要的就是DefaultTokenServices,默认是生成随机值作为token
     * <p>
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        // 这里设置了两个TokenEnhancer,可改变token值,它会在token生成后/保存前调用
        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter()));

        endpoints.authenticationManager(authenticationManager) // 注入authenticationManager开启密码授权模式
                // 必须要配置userDetailsService,才支持refresh token grant,to ensure that the account is still active
                // 这里和SecurityConfiguration的userAccountService也可以不一样,为什么?
                .userDetailsService(userAccountService)
                .authorizationCodeServices(authorizationCodeServices) // 定义authorizationCodeServices支持auth code grant.
                .tokenStore(tokenStore())
                .tokenEnhancer(tokenEnhancerChain);
    }


    /**
     * TokenEnhancer
     *
     * JWT提供的,帮助把OAuth认证信息转为JWT,即access_token,它返回的很多默认字段(jti,ati)都是在这里定义的
     */
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        // 这里使用的密钥也要定义在资源服务里,以便资源服务也可以校验token,否则认证服务就要提供校验token的接口给资源服务
        converter.setSigningKey(orderAuthProperties.getOauthJwtSecret());
        return converter;
    }

    /**
     * TokenEnhancer
     *
     * 向token里添加自定义信息
     */
    @Bean
    public JwtTokenEnhancer tokenEnhancer() {
        return new JwtTokenEnhancer();
    }


    /**
     * 定义token的存储方式:可以放在redis/数据库(oauth_access_token表)/内存,或者jwt中
     * 这里放在JWT里,根本就不必后端存储token了,这是JWT很大的优势
     *
     * 但是JWT也有缺点,1.不容易撤销授权,所以一般令牌时效性很短,撤销授权可以在刷新时实现,怎么实现?
     * 2.如果要存储的信息很多,令牌会变得很大
     */
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }
}
SpringBoot 基于 OAuth2 统一身份认证流程详解 了解OAUTH2统一认证基本概念, 各种角色与协议流程, 了解OAUTH2支持的四种模式, 以及各种模式的不同应用场景。了解整体服务设计, 完成认证服务的搭建配置, 通过postman对功能进行验证, 实现TOKEN的申请与刷新功能。完成用户服务的配置的改进以及 Spring Security的集成, 核心类的处理实现;在整个项目中, 存在公用的地方, 要做统一处理, 比如统一异常和统一接口数据返回, 复用方便, 直观清晰, 便于维护与扩展。 阅读详情

相关推荐

springBoot-springSecurity-OAuth2

springBoot整合OAuth2示例及其代码

子笙的博客 3101

如何在 Spring Boot 中使用 OAuth2

OAuth2 是一种流行的授权协议,用于授权第三方应用程序访问受保护的资源。OAuth2 协议定义了四种角色:资源所有者、客户端、授权服务器和资源服务器。资源所有者是资源的拥有者,客户端是请求访问资源的应用程序,授权服务器是授权客户端访问资源的服务器,资源服务器是托管受保护资源的服务器。客户端向授权服务器发送请求,请求授权访问某个资源。授权服务器向资源所有者询问是否授权客户端访问该资源。如果资源所有者授权客户端访问该资源,则授权服务器向客户端颁发访问令牌。

Java徐师兄的博客 6441

【2.5 认证中心(Spring Security)】基于Spring Security OAuth2实现OAuth2.0授权服务器和客户端

OAuth2.0是一种用于授权的开放标准,它允许用户授权第三方应用程序访问他们的资源,例如照片、联系人列表和其他个人信息。

奶爸的编程之路,也就一周冷个三天 1696

SpringBoot集成OAuth2技术

1.背景介绍 1. 背景介绍 OAuth2 是一种授权协议,它允许用户授予第三方应用程序访问他们的资源,而无需将他们的凭据(如密码)传递给这些应用程序。这种授权协议在现代互联网应用程序中广泛使用,例如在社交网络、单点登录(SSO)和其他云服务中。 Spring Boot 是一个用于构建新 Spring 应用程序的快速开始搭建平台。它提供了一种简单的方法来配置 Spring 应用程序,使其易于...

AI天才研究院 2485

Spring Security OAuth2.0_实现分布式认证授权_网关资源服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记152

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 然后我们再继续看,因为我们说,我们的网关要进行认证对吧,对来的请求进行认证. 然后我们这里把网关微服务,也看成一个资源服务. 然后首先我们可以从order微服务中,把那个tokenconfig类copy过来用,因为我们的网关也需要验证token对吧. 然后我们还需要把这个ResourceServerConfig类copy过来对吧, 因为我们已经把gateway网关当成一个资源微服务

添柴程序猿的专栏 1422

Spring Security OAuth2.0_实现分布式认证授权_微服务解析令牌并鉴权_Spring Security OAuth2.0认证授权---springcloud工作笔记154

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 然后我们接着去看,我们需要其他的微服务就解析令牌,并且进行根据权限判断能不能来访问我们的某个方法 我们看到,我之前都是直接访问这order微服务的,现在我们通过网关来访问,那么 怎么样让资源微服务拿到,网关过来的令牌,用户信息,以及用户权限信息,然后让 这个资源微服务自动进行权限判断呢? 首先我们看看,在这个resourceserverconfig中,可以看到,有scope范围对吧是all

添柴程序猿的专栏 537

Spring Security OAuth2.0 授权服务器搭建:从 0 到 1 实现单点登录

$ \begin{align*} &\text{用户访问客户端} \rightarrow \text{重定向到授权服务器} \ &\rightarrow \text{用户登录} \rightarrow \text{颁发授权码} \ &\rightarrow \text{客户端兑换令牌} \rightarrow \text{访问多个系统} \end{align*} $$通过此实现,用户只需在授权服务器登录一次,即可访问所有信任该服务器的客户端应用,实现真正的单点登录体验。

2501_93895491的博客 392

Spring Security OAuth2.0_实现分布式认证授权_转发明文token给微服务_Spring Security OAuth2.0认证授权---springcloud工作笔记153

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 然后关键来了,我们通过网关微服务来转发明文数据给微服务. 我们通过zuul配置前置过滤器,在前置过滤器中完成用户信息提取,然后把用户的信息,这个用户信息实际上就是从token中解析出来的, 也就是所说的明文token,然后把用户信息,转发给不同的微服务,通过什么方式呢?其实就是 通过把用户信息数据放到request的header中. 首先我们去配置前置过滤器. 这里sho...

添柴程序猿的专栏 476

java spring oauth2.0_Spring Security实现OAuth2.0授权服务 - 进阶版

《Spring Security实现OAuth2.0授权服务 - 基础版》介绍了如何使用Spring Security实现OAuth2.0授权和资源保护,但是使用的都是Spring Security默认的登录页、授权页,client和token信息也是保存在内存中的。本文将介绍如何在Spring Security OAuth项目中自定义登录页面、自定义授权页面、数据库配置client信息、数据库保...

weixin_39759270的博客 607

Spring Boot 与 Spring Security OAuth 2.0:实现授权与认证!

🏆本文收录于《滚雪球学Spring Boot》,专门攻坚指数提升,2025 年国内最系统+最强(更新中)。    本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 1466

MedicalNet实战:3D医疗影像分割从零到部署(PyTorch+ResNet50)

本文详细介绍了基于PyTorch和MedicalNet预训练模型进行3D医疗影像分割的完整实战流程。通过加载ResNet50预训练权重进行迁移学习,大幅降低了对标注数据量的需求,并提升了模型性能。文章涵盖了从数据准备、模型微调、训练优化到最终部署的每一步,为医疗AI开发者提供了从零到部署的清晰指南。

weixin_29062671的博客 587

Spring Security 实现OAuth2.0实现授权服务--基础版

最近想学习以下OAuth2.0 ,就次机会学一下Spring Security ,当然我是借鉴了别人的文章完成的,其中遇到一些问题,但还是做一个记录。一个是想加深一下印象,一个是想以后翻起来回忆的快一点,我借鉴的文章路径如下: https://www.cnblogs.com/xugf/p/10720659.html 首先捋一下OAuth2.0 的知识点 一、OAuth2.0协议 1、...

liuying1802028915的博客 1094

STM32_WS2811驱动

STM32的WS2811驱动

健身房 2839

Spring Security实现OAuth2.0授权服务 - 基础版

一、OAuth2.0协议 1、OAuth2.0概述 OAuth2.0是一个关于授权的开放网络协议。 该协议在第三方应用与服务提供平台之间设置了一个授权层。第三方应用需要服务资源时,并不是直接使用用户帐号密码登录服务提供平台,而是通过服务提供平台的授权层获取token令牌,用户可以在授权时指定token的权限范围和有效期。第三方应用获取到token以后,才可以访问用户资源。 OA...

weixin_30879169的博客 387

CNN经典网络模型(二):AlexNet简介及代码实现(PyTorch超详细注释版)

CNN经典网络模型之一:AlexNet,本文包含其简介及代码,在PyTorch中实现,进行超详细注释,适合新生小白阅读学习~

qq_43307074的博客 2万+

RS485设备联网避坑指南:塔石串口服务器在MODBUS平台中的3个关键配置项

本文针对塔石串口服务器在MODBUS物联网平台接入中的常见问题,详细解析了三个关键配置项:工作模式选择、远程端口与保活机制、寄存器映射与轮询策略。通过对比错误与正确配置案例,帮助工程师避开配置陷阱,实现RS-485设备的稳定、高效联网,提升批量部署的成功率与系统可靠性。

weixin_29281941的博客 404

Spring Security实现OAuth2.0授权服务 - 进阶版

《Spring Security实现OAuth2.0授权服务 - 基础版》介绍了如何使用Spring Security实现OAuth2.0授权和资源保护,但是使用的都是Spring Security默认的登录页、授权页,client和token信息也是保存在内存中的。 本文将介绍如何在Spring Security OAuth项目中自定义登录页面、自定义授权页面、数据库配置client信息...

zhangjunli的博客 747

某手 v8.x 签名计算方法(二) sig和__NS_sig3

一、目标 今天的目标是 sig和__NS_sig3,咱们抓个包先 二、步骤 sig目测像是MD5 先jadx搜索 sig= ,没有找到结果。 再试试 sig ,晕倒 6k多个结果,突然灵光一闪,这些参数,必然是要加入到 Map中,那么我们搜索 "sig" 应该就是这个 CPU.getClock,Hook之 var signCls = Java.use('com.yxcorp.xxx.util.CPU'); signCls.getClock.implementation = function(a,b,c

fenfei331的博客 2427

spring security oauth2.0搭建用户认证服务(四) - 实现第三方登录

项目场景: 前面有说到登录的方式有用户名密码和手机验证码登录,最常用的还有第三方登录。第三方登录其实oauth已经有了很好的集成。 技术详解: 第三方登录的话,其实也是利用了oauth的相关思想。这里就已微信登录为例吧 从上面的流程图就可以看出,这其实就是oauth2的授权码模式,流程如下: 1.第三方应用请求登录,获取code 2.微信端返回code到回调地址 3.第三方应用根据code,获取token 4.第三方应用根据token获取用户信息 APP之前的第三方登录,是前端获取到了

u013911102的博客 3392

PVE虚拟机运行不流畅,出现卡顿。

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 3061

ESP32设备驱动-直流电机与L298N电机驱动器

在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。

视觉与物联智能 3593

jwt实现oauth2.0 java_基于spring boot2.0+spring security +oauth2.0+ jwt微服务架构

项目介绍该项目是一个演示项目,主要演示了,基于spring boot2.0+spring security +oauth2.0+ jwt构建的,单点登录SSO和统一认证和授权的微服务架构项目该项目是一个多模块项目:authorization-server:是一个认证服务器通常情况下,认证服务器也是一个资源服务器用于向其他服务提供用户及权限信息。标准的OAuth2.0提供了四种认证模式,所以认证服务...

weixin_29669899的博客 342

芒果YOLOv5改进55:损失函数篇之KLD:即插即用 芒果首发原创新颖|全网唯一更新KLD改进博客,通过 Kullback-Leibler 散度学习用于目标检测的高精度边界框,提升YOLOv5小目标

YOLOv5改进KLD损失函数:即插即用 原创新颖|芒果专栏独家首发

包括YOLOv5、YOLOv7、YOLOv8等模型改进 661

Spring Security OAuth 2.0授权服务器结合Redis实现获取accessToken速率限制

在生产环境中,我们通常颁发给OAuth2客户端有效期较长的token,但是授权服务无从知晓OAuth2客户端服务是否频繁获取token,便于我们主动控制token的颁发,减少数据库操作,本文我们将结合Redis实现滑动窗口算法限制速率解决此问题。

new_ord的博客 1947

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 自动化测试注册接口,如何生成大量临时邮箱和获取邮箱验证码
下一篇: nginx实现http服务配置
余生之君
博客等级 码龄10年 246粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值