【Spring Security】 Oauth2 颁发令牌端点
【Spring Security】 Oauth2 颁发令牌端点
Metadata
title: 【Spring Security】 Oauth2 颁发令牌端点
date: 2023-02-03 11:06
tags:
- 行动阶段/完成
- 主题场景/组件
- 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
- 细化主题/Module/SpringSecurity
categories:
- SpringSecurity
keywords:
- SpringSecurity
description: 【Spring Security】 Oauth2 颁发令牌端点
【Spring Security】 Oauth2 颁发令牌端点
在之前的文档中,通过[[【Spring Security】 Oauth2 开放平台授权服务四种授权模式|四种授权模式]]及接入[[【Spring Security】 Oauth2 开放平台 资源服务器|资源管理器]]案例,我们了解到,是 Security Oauth2 提供了很多获取令牌及检查令牌的端点。
我们知道在不使用 Oauth 时进行用户名登录时,是由 Security 中的过滤器获取参数,通过 UserDetailsService 获取数据库信息,最后调用认证管理器进行校验登录。
那么 Oauth2 这些端点是如何进行令牌颁发的呢,接下来深入分析一下。
核心类
AbstractEndpoint
AbstractEndpoint 就是 Oauth2 端点的父类,主要是维护了很多成员属性。
public class AbstractEndpoint implements InitializingBean {
// Web 响应异常翻译器,将异常返回给客户端
private WebResponseExceptionTranslator<OAuth2Exception> providerExceptionHandler = new DefaultWebResponseExceptionTranslator();
// 访问令牌颁发对象
private TokenGranter tokenGranter;
// 获取OAuth2 客户端详细信息的服务
private ClientDetailsService clientDetailsService;
// 管理 OAuth2请求的策略
private OAuth2RequestFactory oAuth2RequestFactory;
private OAuth2RequestFactory defaultOAuth2RequestFactory;
public void setProviderExceptionHandler(WebResponseExceptionTranslator<OAuth2Exception> providerExceptionHandler) {
this.providerExceptionHandler = providerExceptionHandler;
}
}
TokenGranter
TokenGranter 就是访问令牌授予者的接口。Oauth2 规范中定义了各种授权类型,每个类型都有一个实现。
每一个实现类就对应了一种授权类型:
ClientDetailsService
ClientDetailsService 就是加载客户端信息的地方了,是提供有关 OAuth2 客户端详细信息的服务。
有两个实现类:
InMemoryClientDetailsService 表示从内存中加载信息,常用的是 JdbcClientDetailsService,可以从数据库中加载客户端信息。
可以看到,JdbcClientDetailsService 定义了查询、修改、删除客户端的相关方法,如果我们自定义 Oauth2 表,就可以根据这个类来扩展或修改。
OAuth2RequestFactory
OAuth2RequestFactory 管理 OAuth2 请求的策略:{@link AuthorizationRequest}、{@link TokenRequest}、{@link OAuth2Request}。
它的主要用途是根据请求,获取请求参数或创建对象,创建不同的请求对象,比如 OAuth2Request、TokenRequest。
它只有一个默认实现类 DefaultOAuth2RequestFactory。
密码模式授权流程
首先回顾下密码模式,我们需要传递客户端的账号和密码,塞入消息头。消息头的格式为: