SpringSecurity随笔(2)-OAuth2协议

news2024/12/28 10:46:26

短信登录

参考密码登录过程

1.编写短信登录过滤器,验证短信验证码
2.编写未认证得SmsAuthenticationToken
3.将未认证的SmsAuthenticationToken传递给AuthenticationManager
4.编写一个SmsAuthenticationProvider
5.调用UserDetialsService获取用户信息

OAuth协议

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。

认证服务器:认证用户身份,生成令牌。 资源服务器:保存用户资源,验证令牌。

授权模式

1.授权码模式
2.密码模式
3.客户端模式
4.简化模式

授权码模式

Spring Social

核心组件

OAuth2Template:OAuth协议核心流程的封装

AbstractOAuth2ApiBinding:不同服务提供商的用户信息

OAuth2Connection:封装获取到的用户信息

OAuth2ConnectionFactory:创建OAuth2Connection实例

ServiceProvider:调用OAuth2Template获取用户信息

ApiAdapter:将获取的用户信息封装为标准的OAuth2Connection

UsersConnectionRepository:应用用户信息和服务提供商用户信息的映射

SpringSocial组件

SpringSocialConfigurer:核心配置组件

SpringSocialConfigurer#configure:创建SocialAuthenticationFilter

1.org.springframework.social.security.provider.OAuth2AuthenticationService#getAuthToken 取授权码

public SocialAuthenticationToken getAuthToken(HttpServletRequest request, HttpServletResponse response) throws SocialAuthenticationRedirectException {//获取授权码
		String code = request.getParameter("code");
		//授权码为空 导向认证服务器,获取授权码
		if (!StringUtils.hasText(code)) {
			OAuth2Parameters params =new OAuth2Parameters();
			params.setRedirectUri(buildReturnToUrl(request));
			setScope(request, params);
			params.add("state", generateState(connectionFactory, request));
			addCustomParameters(params);
			throw new SocialAuthenticationRedirectException(getConnectionFactory().getOAuthOperations().buildAuthenticateUrl(params)); // 拼URL
			// 拿这授权码换令牌
		} else if (StringUtils.hasText(code)) {
			try {
				String returnToUrl = buildReturnToUrl(request);
				// 获取token
				AccessGrant accessGrant = getConnectionFactory().getOAuthOperations().exchangeForAccess(code, returnToUrl, null);
				// TODO avoid API call if possible (auth using token would be fine)
				Connection<S> connection = getConnectionFactory().createConnection(accessGrant);
				return new SocialAuthenticationToken(connection, null);
			} catch (RestClientException e) {
				logger.debug("failed to exchange for access", e);
				return null;
			}
		} else {
			return null;
		}
	} 

2.org.springframework.social.oauth2.OAuth2Template#exchangeForAccess 取token

public AccessGrant exchangeForAccess(String authorizationCode, String redirectUri, MultiValueMap<String, String> additionalParameters) {
		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
		if (useParametersForClientAuthentication) {
			params.set("client_id", clientId);
			params.set("client_secret", clientSecret);
		}
		params.set("code", authorizationCode);
		params.set("redirect_uri", redirectUri);
		params.set("grant_type", "authorization_code");
		if (additionalParameters != null) {
			params.putAll(additionalParameters);
		}
		return postForAccessGrant(accessTokenUrl, params);
 }
//取toknen json格式 
protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
		return extractAccessGrant(getRestTemplate().postForObject(accessTokenUrl, parameters, Map.class));
 } 

3.创建RestTemplate模板

protected RestTemplate createRestTemplate() {
		ClientHttpRequestFactory requestFactory = ClientHttpRequestFactorySelector.getRequestFactory();
		RestTemplate restTemplate = new RestTemplate(requestFactory);
		List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(2);
		converters.add(new FormHttpMessageConverter());
		converters.add(new FormMapHttpMessageConverter());
		converters.add(new MappingJackson2HttpMessageConverter());
		restTemplate.setMessageConverters(converters);
		restTemplate.setErrorHandler(new LoggingErrorHandler());
		if (!useParametersForClientAuthentication) {
			List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
			if (interceptors == null) { // defensively initialize list if it is null. (See SOCIAL-430)
				interceptors = new ArrayList<ClientHttpRequestInterceptor>();
				restTemplate.setInterceptors(interceptors);
			}
			interceptors.add(new PreemptiveBasicAuthClientHttpRequestInterceptor(clientId, clientSecret));
		}
		return restTemplate;
	} 

4.重写org.springframework.social.oauth2.OAuth2Template#postForAccessGrant,定制AccessGrant5.org.springframework.social.security.SocialAuthenticationProvider#authenticate 获取到qq用户信息,进行权限认证

org.springframework.social.security.SocialAuthenticationFilter#doAuthentication

QQ登录和微信登录的不同之处,QQ是拿到accessToken用accessToken去换openId,微信在返回accessToken的同时会返回opendId。

QQ在申请授权码的时候通过OAuth2Template#buildAuthenticateUrl(OAuth2Parameters)拼装了URL

例如:https://graph.qq.com/oauth2.0/authorize? client_id=101087& response_type=code& redirect_uri=http://www.sdasda.cn/qqLogin/qq& state=9c103c5a-34a8-4bf5-82df-c0eca91e8f4a

微信的授权码url不是OAuth2标准的

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

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

相关文章

【Linux杂篇】经常登录Linux,用户密码背后的知识了解一下

一&#xff0c;用户密码存放在哪里&#xff1f; 说到这个问题&#xff0c;绝大部分的同学肯定都知道/etc/passwd这个文件&#xff0c;不错&#xff0c;这个文件里存储的就是用户名&#xff0c;密码等信息。 每一行都是一个account&#xff0c;每一行有7个信息&#xff0c;分…

在农业银行做开发是什么样的体验?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

MySQL环境搭建

文章目录1. MySQL的卸载步骤1&#xff1a;停止MySQL服务步骤2&#xff1a;软件卸载步骤3&#xff1a;残余文件的清理步骤4&#xff1a;清理注册表步骤5&#xff1a;删除环境变量配置2. MySQL的下载、安装、配置MySQL的4大版本软件的下载MySQL8.0 版本的安装配置MySQL8.0配置MyS…

超详解通讯录,保姆式教学 ,轻松学会实现通讯录的功能【c语言】

文章目录静态通讯录Contact.htest.c菜单的创建Contact.c初始化通讯录InitContact的实现增加联系人AddContact的实现查找指定联系人的信息SearchContact的实现删除指定联系人DelContact的实现修改指定联系人的信息ModifyContact的实现显示所有联系人的信息ShowContact的实现完整…

vite项目为什么可以直接使用NODE_ENV?

背景 我们知道&#xff0c;在process.env中并没有NODE_ENV这个变量&#xff0c;但是我们却可以在项目的代码中使用process.env.NODE_ENV这个值来判断当前是development环境还是production环境&#xff0c;然后进行后续的逻辑操作。 这说明&#xff0c;在vite内部&#xff0c;…

大数据面试题集锦-Hadoop面试题(二)-HDFS

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题&#xff0c;关注一下"张飞的猪大数据分享"吧&#xff0c;公众号会不定时的分享相关的知识和资料。 1、 HDFS 中的 block 默认保存几份&#xff1f; 默认保存…

MacBook Pro外接显示器竖屏显示

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3;哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d;一位上进心十足的【Java ToB端大厂领…

接口性能测试避坑 Django+Nginx+uwsgi接口性能调优postman Apifox ab

Django开发了个接口供外部调用&#xff0c;Django的并发性能弱早有所闻&#xff0c;所以采用DjangoNginxuwsgi架构来提高并发量。然后使用测试工具测试并发量。服务器配置&#xff1a;CPU 2&#xff0c;内存8G接口内容只有3句&#xff1a;request_data {"code":&quo…

MyBatis复习

本文章根据尚硅谷MyBatis教程整理而来 原视频地址&#xff1a;https://www.bilibili.com/video/BV1VP4y1c7j7 MyBatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁 移到了Google Code。随着开发团队转投Goo…

力扣刷题记录——521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字符串中的单词 III

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《521. 最长特殊序列 Ⅰ、541. 反转字符串 II、557. 反转字…

PhotoZoom Pro8全新版本功能介绍及系统要求

PhotoZoom 2023&#xff08;PhotoZoom 8&#xff09;全新版本震撼来袭。 一款划时代的、技术上产生革命性影响的数码图片放大工具。 我们获取图片的方法&#xff0c;一般是从度娘图片和各个图库里找素材。但一般网上搜索到的很多图片像素都非常小&#xff0c;普通方法放大就像打…

修改配置文件的定时任务

1.问题背景 下发文件给下游系统设置的是定时任务&#xff0c;原本是每天的18&#xff1a;08定时发送&#xff0c;突然下游说要立马发送&#xff0c;于是只能去修改定时任务。 2.修改操作 查看权限—修改权限—备份–修改—重启 查看权限 进入配置文件目录&#xff1a;cd /…

分享77个HTMLCSS源码,总有一款适合您

HTML&CSS源码 分享77个HTML&CSS源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1QRSokzVy2ZAaSD6VR…

DataGear 4.4.0 发布,数据可视化分析平台

DataGear 4.4.0 发布&#xff0c;带来看板新特性&#xff0c;具体更新内容如下&#xff1a; 新增&#xff1a;看板新增dg-chart-manual-render属性&#xff0c;用于控制是否手动渲染图表&#xff1b;新增&#xff1a;看板dg-dashboard-code属性新增"instance"值&…

Linux——线程概念及私有数据和优缺点

目录 一.什么是线程 二.线程私有的数据 三.线程的优点 四.线程的缺点 五.线程与进程对比 一.什么是线程 线程是在进程内部运行&#xff0c;一个进程可以有多个线程。 打个比方&#xff0c;假如人是一个进程&#xff0c;那么走路、思考、吃饭、说话作为不同的线程。一个进…

《Linux Shell脚本攻略》学习笔记-第十章

10.1 Linux的生态系统由网络、硬件、负责分配资源的操作系统内核、接口模块、系统实用工具以及用户程序所组成的。 10.2 运行在计算机中的多个进程都被分配了一个被称为进程ID的唯一标识数字。进程属性包括拥有该进程的用户、进程使用的内存数量、进程占用的CPU时间。 ps命令默…

拉伯证券|年内第二大解禁周来袭

Wind数据显现&#xff0c;除掉新上市公司&#xff0c;本周A股共有54家公司限售股解禁&#xff0c;解禁数量270.57亿股&#xff0c;以最新收盘价计算&#xff08;下同&#xff09;&#xff0c;解禁市值1752.90亿元&#xff0c;为年内第二大解禁周。 本周解禁市值超越10亿元的公司…

YOLOv8代码上线,官方宣布将发布论文,附精度速度初探和对比总结

【YOLOv8 注意事项】 1. YOLOv8 的官方仓库和代码已上线&#xff0c;文档教程网址也刚刚更新。 2. YOLOv8 代码集成在 ultralytics 项目中&#xff0c;目前看不会再单独创建叫做 YOLOv8 的项目。 3. YOLOv8 即将有论文了&#xff01;要知道 YOLOv5 自从 2020 年发布以来&…

阿里云服务器安装图形界面

为了自动化流程安装图形界面&#xff0c;我的服务器是Centos7 1、yum安装gnome图形界面 yum groupinstall “GNOME Desktop” -y 2、安装远程桌面服务端 yum -y install tigervnc-server -y 3、启动远程桌面服务端(将桌面服务绑定到5903端口) vncserver :3 4、阿里控制台放开59…

SpringBoot+VUE前后端分离项目学习笔记 - 【23 权限菜单 续】

BUG1 : 路由跳转问题 访问错误路由&#xff1a; 已登录用户返回404&#xff0c;未登录用户返回登录页面 Route/index.js 路由守卫增加判断 router.beforeEach((to, from, next) > {localStorage.setItem("currentPathName", to.name) // 设置当前的路由名称s…