关于单点登录第一天接触之我见

沙弥 沙弥     2022-08-16     335

关键词:

前几天老大要搭好了项目框架,然后没要我继续跟进,而是做单点登录。我操,跨系统。有点紧张,礼拜天看了看单点登录。

理论梳理:

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

目前相对来讲,实在原来项目的基础上加了一个加密层,就是把当前用户名以一种加密的方式传输给另一个系统,另一个系统接收到加密串对他进行解析,

解析后如果匹配正确,直接登录(因为当时非常纠结为什么加密传输过程中不把密码一起加密传输过去,让对方解密后取匹配?而是只给了用户名,我尝试过传输非用户的假名字,

会报错:解析失败),如果用户名匹配失败则无法登陆。

在这里主要将机密过程做一展示:

package com.zx.ps.aes;

import java.net.URLEncoder;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
 * @author : ckx
 * @date : 2016-12-5 下午9:32:52
 */ 
public class AESUtil {
 
    // 加密
    public static String Encrypt(String sSrc, String sKey) throws Exception {
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }
        // 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print("Key长度不是16位");
            return null;
        }
        byte[] raw = sKey.getBytes("utf-8");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
        return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
    }
 
    // 解密
    public static String Decrypt(String sSrc, String sKey) throws Exception {
        try {
            // 判断Key是否正确
            if (sKey == null) {
                System.out.print("Key为空null");
                return null;
            }
            // 判断Key是否为16位
            if (sKey.length() != 16) {
                System.out.print("Key长度不是16位");
                return null;
            }
            byte[] raw = sKey.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密
            try {
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original,"utf-8");
                return originalString;
            } catch (Exception e) {
                System.out.println(e.toString());
                return null;
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
            return null;
        }
    }
 
    public static void main(String[] args) throws Exception {
        /*
         * 此处使用AES-128-ECB加密模式,key需要为16位。
         */
       // String cKey = "abcdefg123456789";
        // 需要加密的字串
       // String cSrc = "www.FDSA.soEEEEE";
        String cKey = "1234567891234567";
        String cSrc = "20161201121212szzx";
        String url=URLEncoder.encode("DTB90z5MWjtt7ojCU+zvJbqnuke2KPAmffGPW2q8kFA=","UTF-8"); 
        System.out.println(url);
        System.out.println(cSrc);
        // 加密
        String enString = AESUtil.Encrypt(cSrc, cKey);
        System.out.println("加密后的字串是:" + enString);
        // 解密
        String DeString = AESUtil.Decrypt(enString, cKey);
        System.out.println("解密后的字串是:" + DeString);

      enString=URLEncoder.encode(enString);
      System.out.println("URL加密:"+enString);


    }
}

在页面中本系统对另一系统的跳转超链接:

对用户进行加密,并把加密串放入超链接中:

String cKey = "1234567891234567";
            String cSrc = "20161205193612zhongjunhua";
            String ticket=AESUtil.Encrypt(cSrc, cKey);//调用加密方法对用户加密
            System.err.println("###########"+ticket);
       
ticket=URLEncoder.encode(ticket);
System.err.println("ticket1"+ticket);

dmp.put("zxssoticket", ticket);

如此便可以实现简单的单点登录。

 

关于元素居中之我见(干货)

不使用定位    水平居中:text-align=center;(可继承)    竖直居中:margin:0auto;(块级元素)    其他居中:1.文字居中:父元素设置高子元素设置高  line-height=height(父元素)          2.图片居中: ... 查看详情

关于王小云破解md5之我见

CSDN一篇报道说中国数学家王小云等在Crypto2004上提出一种能成功攻破MD5的算法,GIGIX和王兄都在BLOG里引用了相关的报道。MD5是一种摘要算法,所以理论上是不可能从签名取得原文(见下面说明)。认为要从MD5的结果中取得原文才... 查看详情

启承转合——沟通管理之我见

...程,以求思想达成一致和感情的通畅。近年来,在中国,关于沟通的讨论,理论很多。每一个管理类的培训,开篇基本上是关于沟通管 查看详情

领域驱动(ddd)之我见,基于golang实现

...熟的理解,还请本着交流进步的大原则喷之。从去年开始接触和套用DDD以来,已经有1年多时间了。也先后在2个生产项目中主导应用,都是基于.NetCore的,完全参考https://github.com/EduardoPires/EquinoxProject该项目搭建的基础框架。一、... 查看详情

过拟合之我见

    查看详情

async和await之我见(代码片段)

...积压着的许多问题,所以写一篇博客来和大家分享一下。关于异步机制我认为只要记住的以下几点,就可以弄明白了:1.我认为async和awwait两个修饰符中最关键的是await,async是由于方法中包含await修饰符之后才在方法定义中添加... 查看详情

谷歌全景拼接出错之我见

最近,一篇关于使用谷歌AI全景拼接技术对照片进行拼接出错的新闻引爆了社交网络。这和我前段时间所研究的Opencv全景拼接技术有关,因此这篇新闻也引起了我的兴趣。事件的起因是AlexHarker和他的朋友在加拿大路易斯... 查看详情

架构师之我见

...朋友也可以留言,我们共同探讨这个话题。 架构师之我见                                                                                  2009-08-06架构 查看详情

10多年单点登录的工作经历,和单点登录方案的选择,纯口水

接触单点登录10几年了接触单点登录已经有10多年了,从自己写代码开发单点登录系统,到后来逐渐的直接使用开源CAS做解决方案,也算是行业老司机了。自己开发的单点登录自己开发过两套单点登录系统;第一套是使用petstore+EJ... 查看详情

闭包之我见

一、闭包是什么?  · 闭包就是可以使得函数外部的对象能够获取函数内部的信息。  ·闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。... 查看详情

前端之我见(代码片段)

1.HTML介绍1.1服务器本质1importsocket234sk=socket.socket()56sk.bind(("127.0.0.1",8080))7sk.listen(5)8910whileTrue:11conn,addr=sk.accept()12data=conn.recv(8096)13conn.send(b"HTTP/1.1200OK\\r\\n\\r\\n")14conn.s 查看详情

httphelper之我见

    前几月一直用一个Http的访问类去调用WebApi,说句实话最开始没觉有什么,一是技术老,二是觉得比较简单,但是最近我一直关注云开发和AI这块儿微软技术,看到云平台调用API大多类似,所以回想这个早年的调... 查看详情

我之我见:ftp共享

目录1.ftp服务概述...11.1简介...11.2复合TCP连接...11.3数据连接模式...11.3.1主动模式...11.3.2被动模式...11.4数据传输模式...11.5ftp类型...12.部署ftp.22.1安装ftp.22.2ftp功能划分...22.2.1ftp访问控制...22.2.2ftp连接及传输控制...22.2.3ftp上传文件默... 查看详情

fec之我见一

顾名思义,FEC前向纠错,根据收到的包进行计算获取丢掉的包,而和大神沟通的结果就是纠错神髓:收到的媒体包+冗余包>=原始媒体包数据   直到满足 收到的媒体包+ 冗余包>=原始媒体包数据   ... 查看详情

classpathxmlapplicationcontext源代码阅读之我见

由于本人的能力有限,只能说出自己的见解,如有错漏什么的,请大家批评指出。由于代码封装太多,这里只列出了我认为的部分最重要的代码,一些简单的封装代码,不在下面列出。由于代码太过于复杂,在本次博客中,只列... 查看详情

jquery中的callbacks之我见

callbacks是jquery的核心之一。语法如下:jQuery.Callbacks(flags)  flags 类型: String 一个用空格标记分隔的标志可选列表,用来改变回调列表中的行为。once:确保这个回调列表只执行(.fire())一次(像一个递延Deferred).memory:... 查看详情

join()方法之我见

JavaScriptjoin()方法定义和用法join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。语法arrayObject.join(separator)参数描述separator可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分... 查看详情

编译原理之我见

     经过网上的调查,我发现编译原理并不像我所想象的那样简单,我以为编译原理其实就是像塑造一个翻译师一样,赋予它翻译的架构即可,但是经过调查后,结果却不是我所想,编译原理就是将高级语言翻... 查看详情