上周在做一个单点登录的任务,今天有时间就整理一下,当时遇到的问题很多,我会慢慢的回忆记录下来。
首先这个单点登录我们要构思一下:
之前的版本是,跳转的链接url是个固定值,它保存到了数据库,我们点击后输入账号密码登录,它是直接从数据库中获取。而现在我们想要实现的功能是,在A系统通过AD账号登录,直接在A系统内点击B系统图标或文字直接跳转到B系统,无需通过账号密码的其他操作直接进入。同时我们也要保障我们传过去的AD账号一定是安全的(不能明文输出),这时需要我们做个加密和解密的过程。
这是我做的一个流程图,仅供参考:

Created with Raphaël 2.2.0AD账号登录登录到A系统内点击B系统图标或文字传参(将AD账号通过接口传给后台)后台接收到AD账号获取服务器当前的时间,获取配置的密钥通过ASE工具进行加密将加密后的token传给B系统B系统通过ASE工具进行解密判断解密后的AD是否和加密的AD一致?登录到B系统yesno

接下来我们就开始进行代码部分

1、在前端相应跳转位置进行传参。

jumpUrl(item) {//B系统单点if(item.title == "B系统"){const params = new FormData();params.append("userAd", sessionStorage.getItem("userAd"));this.$post("/getbsystemkey.json", params).then(res => {if (res.data){if(res.status == "true"){window.open(this.$bsystemUrl+"account="+res.data);}}}).catch(err => {console.log(err);});}else{window.open(item.url);this.Linklist(item.linkId);}

这里遇到了一个问题:
这是我的问题及解决办法
接口遇到的坑(一)

2、A系统后台进行加密

在加密之前我们需要准备一个密钥key,同时确保A系统和B系统的密钥是同一个,之后才能进行后面的工作。

2.1 在我们的secretkey.porperties加密钥

这里我们就在网上找工具生成密钥,我一直在用的是这个在线密码生成器

bsystemkey=eAcZD5AtD7f5aN5lC5ALz5d3QM5l0ASS

之后在commonVar中引用这个key

public final static String BSYSTEMKEY= propertieKey.getProperty("bsystemkey");
2.2 A系统中进行加密
 /*** 在A系统中进行加密处理*/@RequestMapping(value = "/getbsystemkey")//将你需要的参数传过去public ResponseEntity<String> getbsystemkey(Model model, HttpServletRequest request,String userAd) throws Exception{//yyyy-MM-dd hh:mm:ss为12时制//yyyy-MM-dd HH:mm:ss为24时制SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");// 获取服务器当前时间String serversDate = sdf.format(Calendar.getInstance().getTime());// 获取配置的密钥String bsystemKey=CommonVar.BSYSTEMKEY;String bsystemContent = userAd+"&"+serversDate;try{// 创建ASE工具对象SymmetricASEEncoder sae = new SymmetricASEEncoder();String token=sae.AESEncode(bsystemKey, bsystemContent);/*** 3.return*/return renderData(true, "Success!", token);}catch (Exception e){return renderData(false, "Failure!", null);}}

此时的token中就带有我们的AD和时间,只不过传过去的时候是加密形式的。

2.3 B系统中解密
if("asystem".equals(appId)){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");boolean flag = false;// 获取服务器当前时间String serversDate = sdf.format(Calendar.getInstance().getTime());// 解密tokenAESUtil sae = new AESUtil();//这里的key一定要和上面定义的保持一致//将AD和时间进行分割String[] str = sae.AESDncode("eAcZD5AtD7f5aN5lC5ALz5d3QM5l0ASS",account).split("&");String userAd = str[0];String currentTime = str[1];   System.out.println("userAd="+userAd+"currentTime"+currentTime);//时间对比flag=compare(serversDate,currentTime);if(flag){account=userAd;}else{mv.addObject("msg", "单点key已失效,请重新登录!"); }}

解密中也会重新获取一次本地时间,因为我们想要判断在单点跳转过程中,超过你限制的时间(比如1分钟)它会无法跳转,token失效,需要重新点击在跳转。

/*** S时间对比工具* @param time1* @param time2* @return* @throws ParseException*/public static boolean compare(String time1, String time2) throws ParseException  {// 如果想比较日期则写成"yyyy-MM-dd"就可以了SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar nowTime = Calendar.getInstance();//得到当前时间// 将字符串形式的时间转化为Date类型的时间Date a = sdf.parse(time1);Date b = sdf.parse(time2);//  设置当前时间nowTime.setTime(b);//  增加1分钟nowTime.add(Calendar.MINUTE, 1);b = nowTime.getTime();System.out.println(b);// Date类的一个方法,如果a早于b返回true,否则返回falseif (a.before(b))return true;elsereturn false;}

我的这部分是写到了我之前写好的一个接口里,因为我发现在我新写的接口时,无论怎么加都无法跳转到我写的接口内,而是直接跳转到登录页,(因为我是后接手这个代码具体它的结构和用法还不是很清楚),所以放弃了新写的接口,直接利用之前写好的,你们在写的时候可以自行考虑哈。我的这个仅供参考哈。

3.测试

接下来我们就先校验,我们穿过来的token是否解析成功
因为他是两个项目,所以正常情况下是同时启动2个项目来做测试,但是我的eclipse和电脑有点low,所以只能启动一个哈。
所以我们就在A系统中写一个main方法做测试,然后启动B系统,最后将这个链接放到postman中测试,看是否通过。

3.1 A系统测试main方法,生成加密后的token
public static void main(String[] args) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 获取服务器当前时间String serversDate = sdf.format(Calendar.getInstance().getTime());// 获取配置的密钥String bsystemKey=CommonVar.BSYSTEMKEY;//此test为AD账号String bsystemContent = "test"+"&"+serversDate;try{// 创建ASE工具对象SymmetricASEEncoder sae = new SymmetricASEEncoder();String token=sae.AESEncode(bsystemKey, bsystemContent);System.out.println(token);/*** 3.return*/return;}catch (Exception e){return;}
}

这里会生成一个token

//样例
LcGQ6tr8r0xLNz7ZjgUxK8Fx8B1Mxt8nylCeT5Q1GIs=

我们用postman测试,将这个token携带过去
如果postman测试通了证明你的加密解密没有问题,如果失败了,你要检查下,解密是否正确,或者解析工具是否解析成功。
我使用的加密和解密是根据这篇文章java使用AES对称加密和解密
中间也遇到了一些其他小问题,只不过时间长了,我忘记了,先把我想到的记录下来。以上仅供参考。如有疑问,不对的地方,或者是有更好的办法可以解决,请各位亲多多留言,我会虚心请教学习的!!!!

根据AD账号直接单点登录到第三方系统相关推荐

  1. 公司账号服务单点登录到gitlab

    公司账号服务单点登录到gitlab 目标:使用oauth协议,点击挂在系统的gitlab链接,直接登录到gitlab的服务,如果没有账号则新建 操作: 一.服务端: 1.在自己的系统内添加oauth协 ...

  2. 企业微信 自建服务器,企业微信单点登录自建系统过程记录

    项目上接到一个需求,为方便员工登录各种内部系统,统一以企业微信为入口,在企业微信面板中增加系统跳转链接实现单点登录. 整体思路比较简单,大致如下: 1.由于自建系统和企业微信的用户ID不同,所以需要建 ...

  3. 单点登录与第三方登录 + CSRF-XSS-DNS-DDOS-SQL攻击

    背景 在系统开发初期,系统很少,每个系统都有自己的登录模块,用户直接使用自己的账号进行登录即可. 但当功能不断完善,为了合理利用资源并降低耦合性,往往需要将单系统拆分为多个子系统. 以阿里系的网站为例 ...

  4. 单点登录和第三方登录

    最近做了一些登录相关的工作,顺便看了下常见的登录方案,这里主要从后端的角度梳理一些技术细节. 文章目录 单点登录 第三方登录 单点登录 单点登录(Single Sign On),简称SSO,是目前比较 ...

  5. Cookie + Session登录-Token登录-SSO 单点登录-OAuth 第三方登录

    文章目录 1.Cookie + Session 登录 2. Cookie + Session 存在的问题 3.Token 登录认证 1. Token 机制实现流程 2. Token 机制的特点 3. ...

  6. 不懂第三方网站、App如何接入微信登录怎么办?这里我详解单点登录之第三方微信登录(建议收藏)

    2021/9/3 文章目录 一.前置准备 二.微信登录流程分析 第一步:请求code 第二步:通过code获取access_token 第三步:通过access_token调用获取用户信息 三.接口核 ...

  7. sso 登出_SSO单点登录/登出系统实现

    先把源码贴出来,再慢慢讲解思路和原理以及实现方式 -->源代码1.0 整合了Mybatis +redis/redis集群二级缓存+cookie加密机制+token -->源代码2.1  密 ...

  8. 基于Session共享的单点登录或通行证系统方案

    本文主要描述如何基于Session共享来实现单点登录. 假设有两个应用www.example.com, passport.example.com.本文以SpringSession和Redis来实现相关 ...

  9. 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心...

    基于云端的通用权限管理系统 SAAS服务 基于SAAS的权限管理 基于SAAS的单点登录SSO 基于.Net的SSO,单点登录系统,提供SAAS服务 基于Extjs 4.2 的企业信息管理系统 基于E ...

最新文章

  1. 未能从程序集 XX加载类型XXX的错误解决方法(借以提醒NHibernate使用者)
  2. python学习路线-2020年 Python学习路线及学习目标规划 拿走不谢!
  3. C++ STL string与算法
  4. 没看过这5本硬核技术书,就别说你懂大数据
  5. C#使用 OleDbConnection 连接读取Excel
  6. 基于MATLAB的发票识别系统
  7. 2048小游戏微信小程序源码
  8. Office在线协作(一)- 在本地服务器上安装ONLYOFFICE Docs Community Edition For Windows Server - 超详细安装教程
  9. Bandicam安装
  10. android画a4矩形,将Android视图转换为A4大小的PDF
  11. 浙大博士 130 页论文,教你用人工智能挑西瓜
  12. 电脑使用手机摄像头(超详细)
  13. Unity 游戏脚本
  14. 赠书 | 劲爆!5本书籍大礼包免费送,一网打尽脑科学
  15. 微信公众号图文消息添加word附件教程详解
  16. editor.md中markdown编辑器的实现
  17. 使用libjpeg进行图片压缩
  18. [CC2642R1][VSCODE+Embedded IDE+Cortex-Debug] TI CC2642R1 快速搭建VsCode开发环境
  19. 《七周七并发模型》笔记
  20. 边缘基础设施还差点什么?

热门文章

  1. 我的Java学习之路
  2. Web3 全栈开发指南
  3. php在线加密源代码,2019最新PHP在线云加密平台源码
  4. 用C#做床位一览功能(下)
  5. EasyPoi 实现Word文档内容替换3种情况(正常文本替换、表格文本替换、图表替换)
  6. NLP-Beginner任务三学习笔记:基于注意力机制的文本匹配
  7. 卸载后依然无法安装签名不一致的APP
  8. php小偷程序--获取网站内容
  9. 人工智能技术发展概述
  10. ARMV7-M架构---Part A :Application Level Architecture---A1 Introduction