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

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

理论梳理:

单点登录(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);
    }
}

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

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

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

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

时间: 2024-08-05 10:49:43

关于单点登录第一天接触之我见的相关文章

单点登录原理理解

最近接触了一点单点登录的知识,有一点理解,记录一下.有些问题并没有找到完美的解决方法,还需要找点已有框架来看看. 欢迎留言探讨. 1       概念 1.1     概念及理解 有一个网上广为流传的定义“SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证”. 个人理解,其中的“同一服务器”的限制应当去掉,关键在于“一次登录”,另外,很少有人提及“退出”的处理逻辑,因

CAS单点登录(SSO)完整教程

转:http://blog.csdn.net/frinder/article/details/7969925 CAS单点登录(SSO)完整教程(2012-02-01更新) 一.教程说明 前言 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤 单点登录(SSO):请看百科解释猛击这里打开 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server), 官网:http://www.jasig.org/cas 本教程环境: Tomcat

深入浅出单点登录(SSO)

1. 摘要 ( 注意:请仔细看下摘要,留心此文是否是您的菜,若浪费宝贵时间,深感歉意!!!) SSO这一概念由来已久,也是相当普遍的一种身份验证设计,网络上对应不同场景的SSO解决方案比比皆是,从简单到复杂.安全等级的步步攀升,可谓百花争艳!如:开源的有OpenSSO.CAS ,微软的AD SSO,及基于kerberos 的SSO等等……以上列举的都是些比较成熟的产品或解决方案,安全方面一个胜过一个,尽显开发及使用者的逼格,当然需求所致无谓好坏高低,满足实际之需才是王道! 对于这些SSO方案,各

认识单点登录

初识单点登录 最初接触到单点登录要追溯到3年多以前了,那时候看到的只是passport,当时要做全国所有社区的登录,然后就照着内部文档写了代码,然后就接入了(这里要提一句是百度与腾讯一旦形成产品的技术项目,文档都很不错)然后就没有然后了...... 而知识的珍贵程度却是这样的: 知识珍贵度排名: 听过 < demo过 < 实际工作用过 < 实际工作中被坑过< 实际工作中被多次坑过或者深入研究总结过 所以,脱离工作去学习node可能收效不大,脱离项目去说前端优化可能不让人信服,不被i

CAS单点登录学习笔记

1. 创建证书: 创建文件夹d:\cas\keys,用于存放证书文件(必须先创建文件夹) 以管理员身份运行命令行控制台,进入java的jre\bin目录 cd D:\Software\Java\jre1.8.0_73\bin 执行如下命令: keytool -genkey -alias castest -keyalg RSA -keysize 2048-keystore d:/cas/keys/castest.keystore 此步完成后会在d:\cas\keys目录中找到castest.key

029.[转] SSO单点登录的通用架构实现

单点登录的通用架构实现 pphh发布于2018年4月26日 http://www.hyhblog.cn/2018/04/26/single_sign_on_arch/ 目录 1. 什么是单点登录 2. 用户登录 2.1 认证方式 2.2 授权方式 2.3 第一方登录架构实现 2.4 第三方登录架构实现 2.5 第一方登录和第三方登录的授权区别 2.6 登录架构实现小结 3. 权限控制 3.1 分布式鉴权架构 3.2 集中式鉴权架构 3.3 分布式和集中式鉴权的优缺点 3.4 访问控制的粒度 3.

使用WIF实现单点登录Part II —— Windows Identity Foundation基本原理

在上一篇文章中,我们已经使用WIF构建了一个基于MVC4的简单的身份验证程序,在这篇文章里,我们将探讨一下到底什么是WIF,以及它的工作原理.然后在下一篇文章开始,我们将实际操作,实现单点登录功能. 身份标识的挑战 在上一篇文章也提及到了,大部分的开发人员并不是安全方面的专家,很多人对于身份验证,授权以及用户体验个性化等工作感觉非常的不爽.传统的计算机技术的课程里通常也不会教这些课题,因此这些东西经常在软件开发周期的后半部分才会凸显出来.当今,一个公司里有数十上百个Web应用程序和服务已不是什么

【开发笔记】单点登录CAS测试登录Invalid credentials无效凭据

今天公司要搭建单点登录DEMO,完成第一步简单的搭建成功后测试成功进到登陆界面. 在网上的资料和搭建的流程文档上都写用户名和密码输入相同的就可以登录成功,然而测试后发现会报出如下错误: 经过查找很多资料发现可能是文档和网上的教程资料时间较久,新版本做了改变, 现在的用户名和密码分别为 casuser Mellon (注意密码M是大写) 测试之后进入成功!

【原】保存一下之前spring-session的redis单点登录配置文件【跨域】

由于先前在调试项目的时候需要做单点,但是项目是基于spring-session老版本做的单点登录,没有实现跨域登录,因为只是针对相同域名下的用户缓存进行存储而已,例如 http://127.0.0.1/wap 和 http://127.0.0.1/wap2 ,这样的话只要在 第一个域名登录后再去第二2个域名进行用户登录,则无需重复登录,但是如果是 http://127.0.0.1/wap 和 http://192.168.1/wap2 这样就没办法找到session. <?xml version