第三方集成站点带token访问SpringSecurity应用站点自动登录方案

近期有个WEB项目需要改造。业主找第三方搞了一个集成站点,将多个应用站点的链接集中放在一个导航页面。由于进入集成站点时已经登录过了,业主要求点击这些应用站点的链接时就不必再登录。

以前做过类似项目,用的是单点登录。大家都用同一个登录系统,一次登录,到处同行,不亦快哉。不过也有一些缺点,一是单点登录比较复杂,不好搞。之前我们用过一个开源的单点登录系统cas,代码一大堆,部署也很复杂,然后每个使用它的应用都要有个客户端,总之非常复杂。出了问题也不知道是哪里的毛病。最常见的现象就是多次重定向,用户登录信息在客户端和服务器之间无限被踢皮球。所以每次想到要用这个东东都心烦意乱,甚至吓得面无人色。(详见拙作:《21世纪应用开源单点登录项目CAS之集大成者》)

这还不是最坏的。最大的问题是,使用单点登录,势必要维护共同的用户信息,要么是所有系统都使用同一个用户表,要么是大家同步用户信息。不同的应用系统通常由不同的公司开发,每个都有自己的设计,现在要集成在一起,改造工作量可想而知。有些年代久远,早就过维护期,想改造都不可能。

一、自动登录方案

但这次没有使用单点登录。第三方公司给出了一个方案:
1)在集成站点的导航页面点击应用站点链接时,系统分配一个token;
2)应用站点可以访问集成站点的接口对token进行验证,并获取对应的用户信息。这些用户信息是集成站点的,应用系统不一定有;
3)token验证通过后,应用站点就可以自己决定是否让他登录本系统了。

这种思想,有点类似auth。auth是第三方验证通过后就自动放行了,而这里的方案是,接下来还要应用系统自己做一些处理,即如何在本系统里放行。

这个方案的好处是,不一定要拥有相同的用户信息。如果要求不严格,应用系统验证带过来的token后就可以用一个默认的账号自动登录;如果非要是同一个账号,那么因为验证token的时候会返回用户信息,应用系统完全可以之同步到自己的库里。所以这个方案比较灵活,应用系统的主动权较大,修改工作量比较小,难度也较小。人家有高手啊。

二、应用系统的实现

我们系统采用java开发,安全框架是Spring Security。我的思路是:
1)访问本应用系统时,检查有无带上第三方token,有则执行第2步,无则转向本系统的登录页面
2)验证第三方token合法,则系统自动登录,否则转向本系统的登录页面

关键是如何自动登录。

我从前端的登录页面,按图索骥,发现登录按钮点击后,会提交到后端的“/auth/token”。但是我找来找去,都找不到对应的代码。后端用的这个框架我不熟悉,一问才知,/auth/token是Spring Security自己的实现。这个接口访问后,会返回一个json对象,里面有个关键元素,叫“access_token”,我们前端就是凭这个来认定是否已经登录了本系统的。

很自然地,我要在系统里实现自动登录,那我应该创建并返回这个access_token给前端。问题是,这个创建过程是黑箱,我搞来搞去,都生成不了类似的令牌。最后放弃了,何必自己去搞,系统模拟前端提交,访问一下自己这个/auth/token不就好了吗?代码如下:

	@GetMapping(value = "/autoLogin")public String autoLogin(@RequestParam(value="token3") String token3) {return autoLoginService.autoLogin(token3);}
 @Overridepublic String autoLogin(String token3) {//token3,第三方tokenString re = null;if(checkToken3(token3)) {re = login();} else {re = "token未经授权";}return re;}private boolean checkToken3(String token) {boolean ok = false;//checkUrl,验证第三方token网址String url = String.format("%s?token=%s", checkUrl,token);try {String re = HttpUtils.get(url);JSONObject jobj = JSONObject.parseObject(re);ok = jobj.get("code").toString().equals("200");} catch (Exception ex) {System.err.println(ex.getMessage());}return ok;}private String login() {String re = null;//参照前端提交的参数Map<String, String> params = new HashMap<>();params.put("tenantCode", "10001");params.put("username", account);params.put("password", password);params.put("type", "account");params.put("scope", "ui");params.put("grant_type", "password");params.put("client_id", "browser");Map<String, String> heads = new HashMap<>();heads.put("Authorization", "巴拉巴拉巴拉");heads.put("Content-Type", "application/x-www-form-urlencoded");try {//提交给自己的接口,登录并返回access_token等。HttpUtils是自己写的静态类re = HttpUtils.post(String.format("http://localhost:%s/api/uaa/oauth/token", port), params, heads);} catch (Exception e) {re = e.getMessage();}return re;}

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

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

相关文章

关于python数据可视化的学习(多维数组)

import numpy as np # 通过这个语句可以知道其是否存在nmpy这个包 创建数据 H np.array([[[94,26],[11,11]],[[22,22],[23,23]],[[33,33],[33,34]]]) # 理解其中的逻辑结构然后开始运行 # 一个基础维度逻辑数据结构中包含一个一个二维数据&#xff0c;二维数组之后再次进行升…

Selenium基础:自动化你的网页交互!

在构建Python爬虫的过程中&#xff0c;你可能会遇到需要与网页进行交互的情况&#xff0c;比如填充表单、点击按钮等。这时&#xff0c;Selenium库就成了你的有力工具。Selenium是一个强大的工具&#xff0c;能够模拟用户在网页上的各种操作。本篇博客将向你介绍Selenium的基础…

EdgeX Foundry 设备服务

文章目录 1.设备服务2.设备配置文件3.设备资源4.资源属性&#xff08;Attributes&#xff09;5.资源属性&#xff08;Properties&#xff09;6.设备命令7.资源操作8.REST 命令端点9.推送事件 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.…

好用的AI模型集合

AI-Chat 这个网站提供的AI-Chat 3.5和AI-Chat 4.0聊天机器人&#xff0c;每天都可以免费使用。 不管是学习、工作还是日常生活&#xff0c;都能给我们带来很大的帮助&#xff0c;效率真的可以说是翻倍了。我觉得&#xff0c;如果你想让自己的生活更加高效、更加有序&#xff0…

WEB漏洞 SSRF简单入门实践

一、漏洞原理 SSRF 服务端请求伪造 原理&#xff1a;在某些网站中提供了从其他服务器获取数据的功能&#xff0c;攻击者能通过构造恶意的URL参数&#xff0c;恶意利用后可作为代理攻击远程或本地的服务器。 二、SSRF的利用 1.对目标外网、内网进行端口扫描。 2.攻击内网或本地的…

Selenium 4.0+ 版本的“正确使用”以及“驱动程序的正确安装”

前言 本文是该专栏的第18篇,后面会持续分享python爬虫干货知识,记得关注。 你是否还在使用selenium 3.0+版本呢?如果还是在使用selenium的旧版本,那就好好看完这篇文章,让你立刻使用上最新的selenium版本——selenium 4.0+版本。 我们都知道selenium是一个开源的Web自动…

python+Selenium以IE模式打开edge浏览器

一、修改ie的注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 下边5个文件夹下的2500的值改成3 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 下边5个文件夹下的2…

全量知识系统问题及SmartChat给出的答复 之12 知识图表设计

Q32. 画一个图表 今天&#xff0c;我们开始设计图表&#xff0c;以便能直观表示前面各种概念名相及其位置关系&#xff0c;发现其中的问题和错误。 先画出一个3*3的表格&#xff0c;还有一根对角线&#xff08;左上到右下&#xff09;&#xff0c;上面有列名&#xff0c;分别…

戏说c第二十六篇: 测试完备性衡量(代码覆盖率)

前言 师弟&#xff1a;“师兄&#xff0c;我又被鄙视了。说我的系统太差&#xff0c;测试不过关。” 我&#xff1a;“怎么说&#xff1f;” 师弟&#xff1a;“每次发布版本给程夏&#xff0c;都被她发现一些bug&#xff0c;太丢人了。师兄&#xff0c;有什么方法来衡量测试的…

css实现背景渐变叠加

线性渐变效果图: .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#fff 30%),linear-gradient(to right,pink,skyblue);}径像渐变效果图&#xff1a; .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#…

【SVN】使用TortoiseGit删除Git分支

使用TortoiseGit删除Git分支 前言 平时我在进行开发的时候&#xff0c;比如需要开发一个新功能&#xff0c;这里以蘑菇博客开发服务网关-gateway功能为例 一般我都会在原来master分支的基础上&#xff0c;然后拉取一个新的分支【gateway】&#xff0c;然后在 gateway分支上进…

MySQL学生成绩管理系统based on C++ and Clion

mysql_free_result()函数的作用是释放结果集的内存&#xff0c;是同步的&#xff0c;也就是要中断一下 该实验使用了MySQL链接数据库的基本使用方法&#xff0c;具体使用了 MYSQL_RES 数据库的mysql_store_result()函数的返回值是一个结果集&#xff0c;该函数的作用是检索比…

langchain学习笔记(七)

RunnablePassthrough: Passing data through | &#x1f99c;️&#x1f517; Langchain 1、RunnablePassthrough可以在不改变或添加额外键的情况下传递输入。通常和RunnableParallel结合使用去分配数值给到字典的新键 两种方式调用RunnablePassthrough &#xff08;1&#…

FL Studio21编曲制作软件中文版2024最新版本功能详细介绍

一、软件概述 FL Studio 21&#xff0c;全称Fruity Loops Studio 21&#xff0c;是一款功能强大的编曲制作软件&#xff0c;被广泛应用于音乐创作、编曲、录音、混音和后期制作等领域。其中文版为中国的音乐制作人和爱好者提供了更加便捷的操作体验。 FL Studio 21 Win-安装包…

探索ECMAScript语法的深度奥秘

随着现代Web应用的崛起&#xff0c;ECMAScript&#xff08;简称ES&#xff09;成为了前端开发者的必备利器。ECMAScript定义了JavaScript的语法和基本结构&#xff0c;是JavaScript的标准规范。本文将深入探讨ECMAScript语法的一些精妙之处&#xff0c;为读者揭示其中的深度奥秘…

P10166 [DTCPC 2024] 环

解题思路 满足的序列即为环若图上有环&#xff0c;则代价为0若无环&#xff0c;则在图上已有的边在添加一条回边可形成环对所有的点由小到大排序由于环的大小可以为2初值设为&#xff0c;先不管最小点之间是否有边&#xff0c;反正不会更劣通过拓扑排序找环&#xff0c;在找环…

js:lodash template文件模板语法和应用

文档 https://www.lodashjs.com/docs/lodash.templatehttps://lodash.com/docs/4.17.15#template 语法 <% VALUE %> 用来做不转义插值&#xff1b;<%- VALUE %> 用来做 HTML 转义插值&#xff1b;<% expression %> 用来描述 JavaScript 流程控制。 示例 …

AI技术大揭秘!你不可不知的顶级大模型

在这个数字化飞速发展的时代&#xff0c;AI大模型以其惊人的应用范围和深远的影响力&#xff0c;正逐渐成为各行各业的革命性力量。想象一下&#xff0c;在一个晴朗的午后&#xff0c;一个智能客服系统正轻松地处理着成千上万的客户咨询&#xff0c;不仅回答速度快捷&#xff0…

http状态,cookie、session、token的对比

http是无状态的&#xff0c;也就是说断开会话了服务器就不记得任何事情了&#xff0c;但这样对于用户会很麻烦&#xff0c;因为要不停输入用户名和密码 cookie是放在浏览器里的数据&#xff0c;第一次访问后服务器会set cookie&#xff0c;然后浏览器保存这个cookie&#xff0…

面向制造的设计

面向制造的设计&#xff08;Design for Manufacturing, DFM&#xff09;是一种设计方法论&#xff0c;它强调在产品设计阶段就考虑制造过程中的各种约束和限制&#xff0c;以确保设计的可行性和可制造性。这种方法的目标是在产品设计的早期阶段就优化设计方案&#xff0c;以减少…