sso单点登录实现方案

十禾。 十禾。     2022-10-12     340

关键词:

最近打算做个项目,需要用到单点登录,搜了看了一下资料找到一种单点登录方案,特此记录。

一、实现原理

        将登录系统单独摘出来,做成一个登录子系统。请求登陆时候访问这个子系统,当登陆验证通过的时候,生成一个token存入网站顶级域名下的cookie当中。将与这个token对应的用户状态信息存入缓存中去,并设置生存时间,此处缓存使用的是redis。当其他的子系访问必须登录才可访问的资源时候,必须先到登录系统进行验证token的存在性以及是否过期,验证通过才可进行访问。

      具体流程:(侵权删除)

 

二、重要的地方:

                (1)cookie保存在一级域名下面(我叫做根域名):比如:对于百度,baidu.com就是一级域名,而www.baidu.com或者zhidao.baidu.com这样的域名都是二级域名,而我们可以从二级域名下访问一级域名的cookie。这样我们就可以访问保存到本地的token

            (2)token:这相当于一个令牌,不管你在哪个子系统下面,想要获取登陆状态就需要获得单点登录系统生成的token,这个token是在登陆成功时候生成,生成后保存到redis(缓存)中作为key,key生成规则使用的是UUID,目的是为了防止多个用户登录时候产生冲突,value为用户的信息,并设置有效时间。同时将这个key保存到cookie当中。这样当你需要验证登录状态的时候,只需要取出这个token并去缓存中查询是否存在相应数据,如果存在,就说明是在登陆状态。如果token存在而缓存中不存在说明用户登录状态过期了。如果没有token,说明用户根本没有登录。

三、具体的实现

             核心部分的代码:其中Result保存处理的结果。

  UserServiceImpl:

                   

        //根据用户的用户名密码查询信息
        User temp=userMapper.findByUsernameAndPassword(user);

        //如果用户名密码正确会查询出信息,不对的话无法查询到
        if(temp==null){
            return Result.build(400,"用户名或密码不正确");
        }
        //查询到的话生成token作为键,用户的信息作为值保存到redis中
        String token_ID=UUID.randomUUID().toString().replaceAll("-","");
        temp.setPassword(null);
        jedis.set(TOKEN_ID+":"+token_ID, JsonUtils.objectToJson(temp));
        jedis.expire(TOKEN_ID+":"+token_ID,300);
        //返回给controller层,并从controller层中将token保存到根cookie中
        return Result.ok(token_ID);

     UserController:

        //从service层获取信息,如果登陆成功里面会保存有token
        Result result= this.userService.login(user);
        //将cookie写入本地根域名下面
        if (result.getStatus().equals(200)){
            CookiteUtils.setCookie(request,response,TOKEN_ID,result.getMsg());
        }
        return  result;

四、其他系统调用sso系统

            我设计的是user子系统,里面只有一个登录状态的检测功能。User子系统中通过ajax异步发送信息,调用sso系统的代码进行登录状态的检测,并将数据返回给调用处。但是由于js无法跨域请求数据,所以使用了jsonp(不懂的话百度一下这方面的知识)。大体意思不能通过js跨域请求数据,但可以跨域请求js函数或js文件。

         

    //跨域请求,使用jsonp
    $.ajax({
        type:"GET",
        dataType:"jsonp",
        url:"http://localhost:8080/user/token/"+_ticket,
        success: function (data) {
            //登录成功显示用户名
                if (data.status==200){
                    var username=data.data.username;
                    var html=username;
                    $("#checkLogin").html(html);
                }
        }
    });

 

 

具体代码放在我的github https://github.com/GregZQ/sso

 

ps:如果有不正确的地方请各位提出指正,谢谢。

         

如何设计一个单点登录系统?

如何设计一个单点登录系统(1)? 中,我着重从单点登录系统的由来,单点登录的概念,一个好的单点登录系统应该具备的特点以及本人亲自实现的一个单点登录系统几方面做了些介绍,这篇文章主要介绍下具体实现方案... 查看详情

单点登录实现方案

单点登陆实现方案设计整体流程:设计思路:单点登录涉及?sso?认证中心与众子系统,子系统与?sso?认证中心需要通信以交换令牌、校验令牌及发起注销请求,因而子系统必须集成?sso?的客户端,sso?认证中心则是?sso?服务端,整个... 查看详情

jeesz分布式框架--单点登录集成方案

摘要:第一节:单点登录简介第一步:了解单点登录SSO主要特点是:SSO应用之间使用Web协议(如HTTPS),并且只有一个登录入口.SSO的体系中有下面三种角色:1)User(多个)2)Web应用(多个)3)SSO认证中心(一个)SSO实现包含以下三个原则:1)所有的... 查看详情

jeesz分布式框架--单点登录集成方案

 JEESZ分布式框架单点登录集成方案第一节:单点登录简介第一步:了解单点登录SSO主要特点是:SSO应用之间使用Web协议(如HTTPS),并且只有一个登录入口.SSO的体系中有下面三种角色:1)User(多个)2)Web应用(多个)3)SSO认证中心(一个)SS... 查看详情

jeesz分布式框架--单点登录集成方案

 JEESZ分布式框架单点登录集成方案第一节:单点登录简介第一步:了解单点登录SSO主要特点是:SSO应用之间使用Web协议(如HTTPS),并且只有一个登录入口.SSO的体系中有下面三种角色:1)User(多个)2)Web应用(多个)3)SSO认证中心(一个)SS... 查看详情

jeesz分布式框架--单点登录集成方案

JEESZ分布式框架单点登录集成方案第一节:单点登录简介第一步:了解单点登录SSO主要特点是:SSO应用之间使用Web协议(如HTTPS),并且只有一个登录入口.SSO的体系中有下面三种角色:1)User(多个)2)Web应用(多个)3)SSO认证中心(一个)SSO实... 查看详情

jeesz分布式框架--单点登录集成方案

JEESZ分布式框架单点登录集成方案第一节:单点登录简介第一步:了解单点登录SSO主要特点是:SSO应用之间使用Web协议(如HTTPS),并且只有一个登录入口.SSO的体系中有下面三种角色:1)User(多个)2)Web应用(多个)3)SSO认证中心(一个)SSO实... 查看详情

casserver实现单点登录(singlesignon,简称sso)

一、什么是单点登录。二、利用耶鲁大学的开源项目CAS(CentralAuthenticationService),搭建基于JavaWeb项目的单点登录。三、针对具体项目对CAS做二次开发以适用具体的业务。一、什么是单点登录。   单点登录(SingleSignOn)... 查看详情

简单轻松实现单点登录(sso)(代码片段)

前言:本文虽然使用PHP语言讲单点登录,但是更多讲的是一种实现思想,不仅限于PHP。该单点登录方案完全实现跨域名。JWT的使用只是生成一个唯一token字符串,也可以不利用JWT。重要存储Token方式,Cookie与Redi... 查看详情

jeesz分布式框架单点登录集成方案

第一节:单点登录简介第一步:了解单点登录SSO主要特点是:SSO应用之间使用Web协议(如HTTPS),并且只有一个登录入口.SSO的体系中有下面三种角色:1)User(多个)2)Web应用(多个)3)SSO认证中心(一个) SSO实现包含以下三个原则:1)所有的... 查看详情

基于cas实现sso单点登录(代码片段)

...注公众号,实用技术文章及时了解1.概述1.1.什么是SSO?单点登录(SingleSign-On,简称SSO)是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相... 查看详情

sso单点登录都有哪些实现方式?

1.以Cookie作为凭证媒介最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。2.通过JSONP实现对于跨域问题,可以使用JSONP实现。3.通过页面重定向的方式最后一种介绍的方式,是通过父应用和子应用来回重定向中进... 查看详情

sso单点登录解决方案

...://www.blogjava.net/Jack2007/archive/2014/03/11/191795.html 1什么是单点登陆     单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次... 查看详情

jeesz分布式框架--单点登录集成方案

摘要:第一步:了解单点登录SSO主要特点是:SSO应用之间使用Web协议(如HTTPS),并且只有一个登录入口.SSO的体系中有下面三种角色:1)User(多个)2)Web应用(多个)3)SSO认证中心(一个) JEESZ分布式框架单点登录集成方案第一节:单点登录... 查看详情

sso单点登录--支持c-s和b-s

  前一直在研究SSO单点登录,找了网上很多的解决方案都只是支持B-S架构的。支持B-S架构的就很少了!  我们已经做了一个SSO只支持B-S。现在还要它支持C-S,,,呜呜!为此找了很多方案!解决这个问题的方案主要有两种:1.制... 查看详情

单点登录

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

手把手教做单点登录(sso)系列之一:概述与示例

...合示例、源码以及演示视频,手把手的带大家深入最新的单点登录SSO方案选型与架构开发实战。文末附5个满足不同单点登录场景的gif动画演示(如果看不清请在图片上右键用新窗口打开),本系列后继文章会深入它们的实现方... 查看详情

手把手教你用代码实现sso单点登录(代码片段)

...限时折扣中,一本深入讲解Java基础的干货笔记!单点登录(SingleSign-On,简称SSO)是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互... 查看详情