精华内容
下载资源
问答
  • 单点登陆
    千次阅读
    2020-12-29 17:59:50

    经常听到后端同事说起单点登录,今天查了一下,做了一个小总结。

    前端需要知道的单点登录概述:

    1、一个系统登录流程:用户进入系统——未登录——跳转登录界面——用户名和密码发送——服务器端验证后,设置一个cookie发送到浏览器,设置一个session存放在服务器——用户再次请求(带上cookie)——服务器验证cookie和session匹配后,就可以进行业务了。

    2、多个系统登录:如果一个大公司有很多系统,a.seafile.com, b.seafile.com,c.seafile.com。这些系统都需要登录,如果用户在不同系统间登录需要多次输入密码,用户体验很不好。所以使用 SSO (single sign on) 单点登录实现。

    3、相同域名,不同子域名下的单点登录:在浏览器端,根据同源策略,不同子域名的cookie不能共享。所以设置SSO的域名为根域名。SSO登录验证后,子域名可以访问根域名的 cookie,即可完成校验。在服务器端,可以设置多个子域名session共享(Spring-session)

    4、不同域名下的单点登录:CAS流程:用户登录子系统时未登录,跳转到 SSO 登录界面,成功登录后,SSO 生成一个 ST (service ticket )。用户登录不同的域名时,都会跳转到 SSO,然后 SSO 带着 ST 返回到不同的子域名,子域名中发出请求验证 ST 的正确性(防止篡改请求)。验证通过后即可完成不同的业务。

    下面是详细分析

    单点登录需求

    在项目初期,公司中使用的系统很少,通常一个或者两个,每个系统都有自己的登录系统,用户用自己的账号登录,很方便。

    但随着公司的不断发展,用到的系统随之增多,用户在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于用户来说,是很不好的体验。于是,就想到是不是可以在一个系统登录,其他系统就不用登录了呢?这就是单点登录要解决的问题。

    单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。

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

    image

    如图所示,图中有4个系统,分别是Application1、Application2、Application3、和SSO。Application1、Application2、Application3没有登录模块,而SSO只有登录模块,没有其他的业务模块,当Application1、Application2、Application3需要登录时,将跳到SSO系统,SSO系统完成登录,其他的应用系统也就随之登录了。这完全符合我们对单点登录(SSO)的定义。

    后端实现

    在说单点登录(SSO)的技术实现之前,我们先说一说普通的登录认证机制。

    img

    image

    如上图所示,我们在浏览器(Browser)中访问一个应用,这个应用需要登录,我们填写完用户名和密码后,完成登录认证。这时,我们在这个用户的session中标记登录状态为yes(已登录),同时在浏览器(Browser)中写入Cookie,这个Cookie是这个用户的唯一标识。下次我们再访问这个应用的时候,请求中会带上这个Cookie,服务端会根据这个Cookie找到对应的session,通过session来判断这个用户是否登录。如果不做特殊配置,这个Cookie的名字叫做jsessionid,值在服务端(server)是唯一的。

    同域名下的单点登录

    一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:a.com,同时有两个业务系统分别为:app1.a.com和app2.a.com。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.a.com。

    我们只要在sso.a.com登录,app1.a.com和app2.a.com就也登录了。通过上面的登陆认证机制,我们可以知道,在sso.a.com中登录了,其实是在sso.a.com的服务端的session中记录了登录状态,同时在浏览器端(Browser)的sso.a.com下写入了Cookie。那么我们怎么才能让app1.a.com和app2.a.com登录呢?这里有两个问题:

    • Cookie是不能跨域的,我们Cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求是带不上的。
    • sso、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的。

    img

    image

    那么我们如何解决这两个问题呢?针对第一个问题,sso登录以后,可以将Cookie的域设置为顶域,即.a.com,这样所有子域的系统都可以访问到顶域的Cookie。我们在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。比如:我们不能在自己的系统中给baidu.com的域设置Cookie。

    Cookie的问题解决了,我们再来看看session的问题。我们在sso系统登录了,这时再访问app1,Cookie也带到了app1的服务端(Server),app1的服务端怎么找到这个Cookie对应的Session呢?这里就要把3个系统的Session共享,如图所示。共享Session的解决方案有很多,例如:Spring-Session。这样第2个问题也解决了。

    同域下的单点登录就实现了,但这还不是真正的单点登录。

    不同域名下的单点登录

    同域下的单点登录是巧用了Cookie顶域的特性。如果是不同域呢?不同域之间Cookie是不共享的,怎么办?

    这里我们就要说一说CAS流程了,下面的流程是单点登录的标准流程。

    img

    图解:cas_flow_diagram

    上图是CAS官网上的标准流程,具体流程如下:

    1. 用户访问app系统,app系统是需要登录的,但用户现在没有登录。
    2. 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。
    3. 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
    4. SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
    5. app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
    6. 验证通过后,app系统将登录状态写入session并设置app域下的Cookie。

    至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问app2系统时的流程。

    1. 用户访问app2系统,app2系统没有登录,跳转到SSO。
    2. 由于SSO已经登录了,不需要重新登录认证。
    3. SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
    4. app2拿到ST,后台访问SSO,验证ST是否有效。
    5. 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。

    这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。

    有的朋友问我,SSO系统登录后,跳回原业务系统时,带了个参数ST,业务系统还要拿ST再次访问SSO进行验证,觉得这个步骤有点多余。他想SSO登录认证通过后,通过回调地址将用户信息返回给原业务系统,原业务系统直接设置登录状态,这样流程简单,也完成了登录,不是很好吗?

    其实这样问题时很严重的,如果我在SSO没有登录,而是直接在浏览器中敲入回调的地址,并带上伪造的用户信息,是不是业务系统也认为登录了呢?这是很可怕的。

    小结

    单点登录(SSO)的所有流程都介绍完了,原理大家都清楚了。总结一下单点登录要做的事情:

    • 单点登录(SSO系统)是保障各业务系统的用户资源的安全 。
    • 各个业务系统获得的信息是,这个用户能不能访问我的资源。
    • 单点登录,资源都在各个业务系统这边,不在SSO那一方。 用户在给SSO服务器提供了用户名密码后,作为业务系统并不知道这件事。 SSO随便给业务系统一个ST,那么业务系统是不能确定这个ST是用户伪造的,还是真的有效,所以要拿着这个ST去SSO服务器再问一下,这个用户给我的ST是否有效,是有效的我才能让这个用户访问。

    参考链接:百度百科 https://baike.baidu.com/item/%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95/4940767

    更多相关内容
  • 利用springMvc 实现的简单的单点登录Demo,内含三个小Mavn项目分别是 1、认证中心SSOServer 2、子系统1SSOClient1 3、子系统2SSOClient2 文章请参考 http://blog.csdn.net/qq_31183297/article/details/79419222
  • java 单点登录源代码

    热门讨论 2014-11-10 15:48:44
    java web单点登录源代码,一个验证系统,两个测试系统
  • 通过redis(缓存)实现单点登录

    热门讨论 2015-05-19 16:45:44
    跨应用访问 通过redis实现单点登录。即保证安全又减少多次输入密码的繁琐。
  • Spring Cloud 安全:集成OAuth2实现身份认证和单点登录 示例代码
  • cookie实现单点登录

    万次阅读 2021-11-07 12:45:10
    单点登录方案设计一篇中,我们谈到了目前市面上常用的一些单点登录方案的实现,关于单点登录,只需要把握一个核心的要点即可,那就是:一处登录,处处登录,登录之后,即同域下其他各个系统都能统一拿到用户的基本...

    前言

    单点登录方案设计一篇中,我们谈到了目前市面上常用的一些单点登录方案的实现,关于单点登录,只需要把握一个核心的要点即可,那就是:一处登录,处处登录,登录之后,即同域下其他各个系统都能统一拿到用户的基本信息

    关于cookie,想必大家也很熟悉了,cookie中可以存储会话信息,将用户的基本信息存储进去之后,就可以在前后端交互中进行传输了

    本篇将分享基于cookie如何实现单点登录,本篇以实际案例为主进行演示

    业务背景

    以一个大家熟悉的购物业务,实际项目中,一个商城系统可能包含诸多模块的业务,比如用户中心,专门负责用户的认证功能,购物车、会员、物流等多个板块,用户只需要一次登录之后,就可以在各个业务模块的界面中来回切换

    在这里插入图片描述

    环境准备

    JDK8 , maven , idea

    实现目标

    • 用户通过用户模块的主页面登录之后,可以访问任意的其他模块,比如购物车模块的页面
    • 未登录访问其他任何模块,直接跳转到登录页面
    • 用户模块退出之后,再访问其他任何模块的页面,将无法访问

    工程搭建

    在这里插入图片描述

    整个工程结构如上图所示, 各个模块的说明如下:

    • sso-main 业务主模块,也是登录的入口
    • sso-login 负责登录业务,实际可理解为用户中心
    • sso-cart 购物车模块
    • sso-vip 会员模块

    后续可以在此基础上继续增加,比如积分模块,物流模块等

    1、顶级pom依赖

    	<parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <version>2.2.1.RELEASE</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    

    sso-login模块

    该模块主要负责用户的登录,退出,并将用户会话信息存储至token,同时为其他各个模块提供用户信息查询功能

    1、pom依赖

     	<dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.13</version>
            </dependency>
    
        </dependencies>
    

    2、yml配置

    server:
      port: 9000
    

    3、登录页面

    提供一个基于thymeleaf的html登录模板页

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>login</title>
    </head>
    <body>
    <h3>登陆页面</h3>
    <form action="/login" method="post">
        用户名:<input type="text" name="username"/>
        密码:<input type="password" name="password"/>
        <input type="submit" value="登录"/>
        <p style="color: red" th:text="${session.msg}"></p>
    </form>
    </body>
    </html>
    
    

    4、提供一个controller

    ViewController 用户进行跳转至登录页,作为引导控制器

    /**
     * 页面跳转逻辑
     */
    @Controller
    @RequestMapping("/view")
    public class ViewController {
    
        /**
         * 跳转到登陆页面,设置重定向的地址,可以携带cookie-TOKEN,如果有cookie,不用跳转到登陆页面,直接重定向
         * @return
         */
        @GetMapping("/login")
        public String toLogin(@RequestParam(required = false, defaultValue = "") String target,
                              HttpSession session, @CookieValue(required = false, value = "TOKEN") Cookie cookie){
    
            //传入参数为空,默认跳转到首页
            if (StringUtils.isEmpty(target)){
                target = "http://127.0.0.1:9010";
            }
            //若已经登陆的用户登陆系统时,直接重定向到target
            if (cookie != null){
                String value = cookie.getValue();
                User user = LoginCacheUtil.loginMap.get(value);
                if (user != null){
                    return "redirect:" + target;
                }
            }
            //重定向地址,将地址保存起来
            session.setAttribute("target",target);
            return "login";
        }
    }
    

    LoginController 实际处理登录逻辑的控制器,提供登录,登出,以及查询用户信息的接口,这里为了模拟数据库的用户,就直接在程序中模拟初始化一些用户数据

    @Controller
    @RequestMapping("/login")
    public class LoginController {
    
        private static Set<User> dbUsers;
    
        /**
         * 模拟数据库的用户列表
         */
        static {
            dbUsers = new HashSet<>();
            dbUsers.add(new User(0,"zhangsan","123456"));
            dbUsers.add(new User(1,"lisi","123456"));
            dbUsers.add(new User(2,"wangwu","123456"));
        }
    
        @PostMapping
        public String doLogin(User user, HttpSession session, HttpServletResponse response){
            String target = (String) session.getAttribute("target");
            User res = null;
            for (User dbUser : dbUsers){
                if(dbUser.getUsername().equals(user.getUsername()) && dbUser.getPassword().equals(user.getPassword())){
                    res = dbUser;
                }
            }
            //用户登陆成功,保存(TOKEN,用户)
            if (res != null){
                //保存用户登陆信息
                String token = UUID.randomUUID().toString();
                Cookie cookie = new Cookie("TOKEN",token);
                cookie.setDomain("127.0.0.1");
                response.addCookie(cookie);
                LoginCacheUtil.loginMap.put(token,user);
            } else {
                session.setAttribute("msg","用户名或密码错误");
                return "login";
            }
            //重定向到target地址
            return "redirect:" + target;
        }
    
        /**
         * 给其他子系统开发一个接口,根据token获取登陆的用户信息
         * @param token
         * @return
         */
        @GetMapping("/info")
        public ResponseEntity<User> getUserInfo(String token){
            if (!StringUtils.isEmpty(token)){
                User user = LoginCacheUtil.loginMap.get(token);
                return ResponseEntity.ok(user);
            }else {
                return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
            }
        }
    
        @GetMapping("/logout")
        public String logout(@CookieValue(value = "TOKEN")Cookie cookie, @RequestParam("target") String target,
                             HttpSession session,HttpServletResponse response){
            //删除用户的登陆信息
            LoginCacheUtil.loginMap.remove(cookie.getValue());
            //删除session.loginUser
            session.removeAttribute("loginUser");
            //设置cookie过期
            Cookie newCookie = new Cookie("TOKEN",null);
            newCookie.setMaxAge(0);
            newCookie.setPath("/");
            response.addCookie(newCookie);
            return "redirect:"+target;
        }
    
    }
    
    

    sso-main 模块

    1、pom依赖

    同 sso-login

    2、yml配置

    server:
      port: 9010
    

    3、配置简单的html

    由于需要进行页面展示,并模拟登录过程,这里使用了thymeleaf模板,使用比较简单,main模块的页面主要负责登录之后跳转后的主页面,简单起见,只需要对登录之后的用户信息做一下展示即可

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
        <h1>欢迎来到main首页</h1>
        <span>
            <a th:if="${session.loginUser} == null" href="http://127.0.0.1:9000/view/login?target=http://127.0.0.1:9010/view/index">登陆</a>
            <a th:unless="${session.loginUser} == null" href="http://127.0.0.1:9000/login/logout?target=http://127.0.0.1:9010/view/index">退出</a>
        </span>
        <p th:unless="${session.loginUser} == null">
            <span style="color: deepskyblue" th:text="${session.loginUser.username}"></span>已登陆
        </p>
    </body>
    </html>
    

    4、编写一个controller

    当用户登录成功后,需要进行页面跳转,即跳转到main的页面,由于是不同的业务模块,实际项目中,可能是分布式部署的话,为了拿到用户的登录信息,这里简单采用restTemplate的方式

    @Controller
    @RequestMapping("/view")
    public class ViewController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        private final static String REMOTE_LOGIN_INFO_ADDRESS = "http://127.0.0.1:9000/login/info?token=";
    
        @GetMapping("/index")
        public String toIndex(@CookieValue(required = false, value = "TOKEN")Cookie cookie, HttpSession session){
            if (cookie != null){
                String token = cookie.getValue();
                //根据login子系统暴露的info方法去根据token获取user
                if (!StringUtils.isEmpty(token)){
                    Map result = restTemplate.getForObject(REMOTE_LOGIN_INFO_ADDRESS + token, Map.class);
                    session.setAttribute("loginUser",result);
                }
            }
            return "index";
        }
    }
    

    sso - main 和sso-login模块写好之后,我们就可以简单做个测试了,分别启动这两个模块

    1、访问登录入口页面,http://127.0.0.1:9010/view/index
    在这里插入图片描述
    2、点击登录

    登录之后,由sso-main模块中的页面上的a链接,携带一个完整的href地址跳转到sso-login的登录主页面,我们的实现逻辑是,进入登录页面时,由于携带了完整的url信息,里面包含了从哪个页面(这里从main模块)过来的,那么在sso-login登录成功之后,还能跳转回去原来的页面
    在这里插入图片描述
    3、输入程序中初始化的用户名和密码

    在这里插入图片描述

    在这里插入图片描述
    在sso-login的doLogin接口处理完成之后,将会把登录用户的信息写入session并带来页面上进行展示;

    同时用户登录成功后,在接口中我们生成了一个token,用一个map进行存储,token作为key,user对象作为value,方便在后续其他模块访问的时候,直接从map中快速获取,关于这一点,在实际开发项目中,可以考虑使用threadLocal进行存储

    如何验证我们的单点登录是好使的呢?还没有完,上面只是完成了用户的登录,接下来我们再将另外2个模块的业务逻辑编写完整

    sso-vip 模块

    该模块作为会员业务模块,另外的cart购物车模块也是如此

    1、pom依赖

    如上的sso-login

    2、yml配置

    server:
      port: 9011
    

    3、html页面

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Vip</title>
    </head>
    <body>
        <h1>欢迎来到VIP页面</h1>
        <span>
            <a th:if="${session.loginUser} == null" href="http://127.0.0.1:9000/view/login?target=http://127.0.0.1:9011/view/index">登陆</a>
            <a th:unless="${session.loginUser} == null" href="http://127.0.0.1:9000/login/logout?target=http://127.0.0.1:9011/view/index">退出</a>
        </span>
        <p th:unless="${session.loginUser} == null">
            <span style="color: deepskyblue" th:text="${session.loginUser.username}"></span>已登陆
        </p>
    </body>
    </html>
    

    该页面主要展示登录成功后的用户信息

    4、提供一个controller,用于从sso-login中获取用户信息

    @Controller
    @RequestMapping("/view")
    public class ViewController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        private final static String REMOTE_LOGIN_INFO_ADDRESS = "http://127.0.0.1:9000/login/info?token=";
    
        @GetMapping("/index")
        public String toIndex(@CookieValue(required = false, value = "TOKEN")Cookie cookie, HttpSession session){
            if (cookie != null){
                String token = cookie.getValue();
                if (!StringUtils.isEmpty(token)){
                    Map result = restTemplate.getForObject(REMOTE_LOGIN_INFO_ADDRESS + token, Map.class);
                    session.setAttribute("loginUser",result);
                }
            }
            return "index";
        }
    }
    

    接下来启动该模块,下面开始测试,

    1、在已经登录的情况下,输入:http://localhost:9011/view/index

    已经登录的情况下,VIP模块的controller中通过rest接口可以拿到cookie中用户的信息,因此直接将用户信息取出进行页面展示
    在这里插入图片描述

    2、在未登录的情况下,输入:http://localhost:9011/view/index

    先点击退出登录,然后直接展示登录页面的信息
    在这里插入图片描述

    最后我们将cart模块也仿照vip博客搭建好,启动项目,然后再次做测试,

    3、访问car模块主页面:http://127.0.0.1:9012/view/index

    由于第二步中进行了退出,这时候,访问cart页面时,也是需要登录的状态
    在这里插入图片描述
    4、cart中点击登录,并进行登录操作

    登录成功后,我们再次刷新cart页面,这时候显示已登录

    在这里插入图片描述

    通过以上案例的展示,我们基于cookie的方式实现了模拟单点登录的效果,此种方案,在不少生产级的项目中仍有使用,关于cookie实现单点登录,做一下简单的说明

    优点:

    • 实现难度低,无需太多的学习成本
    • 后续维护相对简单
    • 新的业务模块加入时,扩展实现成本较低

    缺点:

    • cookie中如果存放了用户的敏感信息,一旦被窃取,这个负面影响大,生产环境,最好使用加密手段加密
    • 如果大量的用户信息放入cookie,对浏览器端压力较大,同时cookie存储的信息量大小有限
    • 不够轻量级,跨域情况下将会带来一定的麻烦(这种问题,需要考虑到自身系统和外部系统对接问题)
    展开全文
  • 实现OAuth2授权,并且实现单点登录的小例子,请使用vs2015打开
  • 单点登录方案设计

    千次阅读 2021-07-11 08:59:41
    单点登录在任何稍成规模的分布式系统,或者sass,或者中台型的架构中,都是必不可少的,单点登录主要达到的目的是:一处登录,处处登录 这里主要提2种实际生产环境下比较常用的2种业务场景,第一种,产品自身的单点...

    前言

    单点登录在任何稍成规模的分布式系统,或者sass,或者中台型的架构中,都是必不可少的,单点登录主要达到的目的是:一处登录,处处登录

    这里主要提2种实际生产环境下比较常用的2种业务场景,第一种,产品自身的单点登录需求,比如像下面这张图:

    在这里插入图片描述
    这张图反映的是一些类似sass系统或者业务中台类似的体系架构,一个系统的各个产品均能通过一个统一的登录入口进入,然后由各个产品应用图标,再进入各自的模块产品

    第二种业务场景是,当涉及到和第三方应用进行对接的时候,第三方系统希望共享与本系统的部分用户信息,通俗来讲就是,本系统的某些产品对接了第三方平台的应用,客户端希望能够在本系统和外部系统之间来回切换,而不用重复在2个平台之间进行登录,以下图进行理解:

    在这里插入图片描述

    本篇以上面的2个需求点入手,从业务的角度引申到实际方案的实现进行一些探讨和经验的分享

    平台内部单点登录实现方案

    1、cookie实现方案

    这是一种最简单的单点登录实现方式,是使用cookie作为媒介,存放用户会话凭证

    简而言之,用户登录父应用之后,应用返回一个cookie(或加密的cookie),当用户访问子应用的时候,携带上这个cookie,授权应用拿到cookie并进行校验,校验通过则允许该用户访问当前应用

    在这里插入图片描述

    cookie信息通常可以在浏览器中进行查看,如果后端没有做任何的处理,通常以jsessionid进行展示

    我们知道,对于sass平台或类似的系统,父应用或者顶级应用在登录成功后,会进入主域名,比如taobao.com,然后再从主域名进入各个子系统,即二级域名下,如果是同域的情况下,cookie的会话信息是可以共享(或者传递)的,这样的话,当主域名的用户关键信息存至cookie后,其他子域下的系统就可以拿到当前cookie的信息进行解析并获取用户信息

    cookie方案可使登录后的用户在各个应用之间正常的访问,当然,在实际生产中,同一个用户在各个应用之间的切换与访问也是有前提条件的,那就是权限体系的认证,即至少保证当前用户拥有要访问应用的权限

    在小编过往的项目中,sass平台有一个统一用户系统,所有访问系统的用户均需在用户的体系下存在,然后在用户系统中进行对使用其他应用的访问权限进行统一配置(赋权)之后,才能进行各个应用之间的切换,从具体的实现来说,主要分为如下步骤:

    1. 用户中心注册用户(或管理员添加)
    2. 其他应用访问权限配置(菜单,资源授权等)
    3. 用户登录统一认证系统
    4. 各应用通过用户中心统一dubbo接口返回值做进一步业务处理
    5. 校验是否切换至不同应用

    在这里插入图片描述
    2、token实现方案

    cookie方案在实际实施的时候,被很多人吐槽的点有2个,容易被截取(不够安全),不够轻量级,就这2点,就足够成为分布式应用下如何高效进行会话传输被舍弃的因素了,因此在本人经历的项目以及从主流的解决方案下,token方案开始越来越被很多互联网公司接受

    token的实现相对简单,前后端交互方便,存储的安全性可以根据采用的加密技术提升安全性,主流的实现像:springsecurity , jwt+shiro 等,都是不错的实现思路

    具体来说,token的实现方案和cookie的实现方案本质不同点在于会话信息的传输上有所不同,其基础的架构体系并没有太大的差别,但token解决这个问题更灵活的地方在于,

    • 可以根据业务需要定制化加密方案
    • 可以在数据库层面或者其他数据存储上面存储
    • 可以灵活的做会话的自动续期

    总的来说,业务层面的操作和上面cookie方案中的没有本质差别,只体现在具体的实现上,这样以来,用户中心的总体业务层的规划可按如下理解

    在这里插入图片描述
    关于token的具体落地实现方案,有兴趣的同学可以参考我之前的2篇文章:springboot+shiro实现安全认证以及基于springcloud实现安全认证

    总结一下,以上两种实现方案适合初具中台规模或者类sass系统的平台,拥有独立的用户中心体系,需要通过独立的用户中心进行其他应用的资源配置,认证,授权等,在这种架构下,采用单点登录具有它存在的价值和意义,毕竟单独把用户中心拆分成独立的微服务,是需要投入一定的技术和人力成本的

    与第三方平台对接时单点登录实现方案

    当sass系统做大了之后,比如像支付宝,很多其他第三方应用为了对接支付宝的支付体系,举例来说,当我们在美团下单时,提示我们选择支付宝支付的时候,需要跳转到支付宝的一个认证页面进行认证,只有认证通过之后,才能进行支付

    这里涉及到一个用户信息的转换问题,可以理解为认证中心,这个认证中心具备用户认证,以及分发凭证的功能,认证中心的实现我们无从得知,但是可以参考springsecurity的认证功能实现,和oauth2那一套大体类似

    我们这里探讨的是一种更通用的基于sass平台或者中台模式的实现,即假定通过我们自身的sass平台跳转到第三方平台的应用系统,或者由第三方应用系统跳转到我们自身的sass系统,该如何实现的问题

    方案一:第三方应用作为自身平台的一个应用注册

    第三方系统作为一个应用,集成到自身的sass平台。用户以自身平台为入口登录并跳转至第三方系统

    同域

    当自身平台与第三方系统同域时,第三方系统能够直接通过Cookie获取本平台用户会话信息(token),通过调用本平台提供的相关dubbo接口即可获取用户信息,进而同步用户至第三方系统并实现免登录

    在这里插入图片描述

    同域情况下,第三方应用可以拿到本平台的cookie信息,拿到之后,进一步调用本平台提供的dubbo接口获取用户的数据,一般来说,这种情况下,第三方系统为了更好的管理用户数据,需要和本平台的用户信息进行适配,对第三方系统来说,只需要自己的系统用户表中做一个映射即可达到目的

    非同域

    当自身sass平台与第三方系统非同域时,第三方系统就无法通过浏览器Cookie信息获取自身sass平台用户会话信息,这时候可以借助中间件,通过中间件传递用户信息

    • 在上一步的基础上,仍然将第三方应用注册到本平台
    • 第三方平台需要监听特定的消息队列
    • 本平台用户登录成功后,向消息队列推送当前用户会话信息
    • 第三方平台从消息队列解析用户信息,执行自动登录

    方案二:将本平台作为一个应用注册到第三方系统

    此种方案需要提供本平台用户登录的URL给第三方系统,同样需要考虑同域和非同域的情况

    同域

    需要根据情况实现特殊单点登录SPI服务

    当本平台与第三方系统同域时,第三方系统将会话信息(识别用户即可)写入浏览器Cookie,随即跳转至本平台登录页面,特殊单点登录SPI服务(需要实现)读取Cookie中的用户信息,对用户进行同步、免登录等。

    通常这种方式涉及到2个系统的对接,需要对方的开发人员提供一些配置信息,比如本系统提供登录的URL,而第三方系统提供登录回调的URL,这样的话在本系统完成登录的逻辑之后才知道调回的路径

    但是本人经历的项目中是这么做的,提供一个基于spi实现的一个验证token的jar包,这个jar包可立即为一个简单的工程,该工程实现了一个关键的接口,在该接口中实现的逻辑是,校验token,解析出用户信息,然后执行自动登录,并跳转url

    在这里插入图片描述

    很明显,这个jar包是作为连接本系统和第三方系统用的

    非同域

    当本平台与第三方系统非同域时,第三方系统无法将会话信息写入浏览器Cookie,这时候需要实现中间件部署在与本平台同域环境中,第三方系统先跳转至中间件页面,通过中间件将用户信息写入Cookie,最后跳转至UYUN平台登录页面,特殊单点登录SPI服务(需要实现)读取Cookie中的用户信息,对用户进行同步、免登录等。

    在这里插入图片描述

    图中的中间件可理解为一个需要通过消息中间件实现用户信息传递的一个工程,该工程部署在和本平台同域的环境上

    方案三:CAS单点登录

    这种方案的实现网上可以参考的资料非常多,也是当下比较简单的一种实现,开发者只需要对cas证书做配置,这里不再赘述了

    展开全文
  • SSO单点登录 什么是单点登录 随着互联网大数据不断发展,应用服务的不断增多,单点登录越来越能够凸显其作用。单点登录 SSO(Single Sign On),顾名思义就是单个节点登录,全局使用。是目前最为流行的统一登录解决...

    SSO单点登录

    什么是单点登录

    随着互联网大数据不断发展,应用服务的不断增多,单点登录越来越能够凸显其作用。单点登录 SSO(Single Sign On),顾名思义就是单个节点登录,全局使用。是目前最为流行的统一登录解决方案。

    为什么使用

    目的就是为了快速实现用户认证,统一管理用户信息, 避免重复维护用户数据; 分离用户与业务数据,让业务 服务专注于业务功能的实现,让用户中心服务统一认证,减少频繁认证次数, 同时保障数据的安全性。

    应用场景

    • 内部的服务统一认证与授权,比如电商网站, 内部的用户服务、订单服务、库存服务、资金服务等,以 用户服务作为认证服务中心, 实现统一认证与授权。
    • 外部的第三方登录认证与授权,比如登录某个论坛网站, 可以采用FaceBook或者Google账号进行登录。
    • 云服务应用,比如使用阿里云的消息推送服务,但不想创建和管理用户,就可以采用基于SAML协议实现 SSO单点登录。

    淘宝天猫登录场景解析

    访问淘宝网站, 登录之后, 再访问天猫网站, 你会发现, 天猫也是处于登录状态,那么具体是如何实现的?

    登录技术方案分析

    淘宝登录:

    天猫登录:

    目前整个登录体系是以淘宝作为中心,天猫通过淘宝作鉴权登录。整个鉴权体系是采用跨域cookie + 分布式 session作为解决方案:
    淘宝是如何解决Cookie跨域问题,目前淘宝是采用如下方案做处理:
    通过内嵌iframe,访问统一域名,实现Cookie信息共享,如果禁用Cookie,你会发现无法正常登录;同时利用静态资源不受同源策略的限制,通过JSONP跨域方式来获取用户的登录状态。

    Response会返回Token信息:

    var userCookie= {dnk:'',_nk_:'',_l_g_:'',ck1:'',tracknick:'',mt:'ci=0_0',l:'eBMMyMa4QmFJBq7pBO5aourza77T3Id b4sPzaNbMiInca6BPO3JuhNQqw5H95dtjgtC3xetzm21B9dLHR3fRwxDDBTJbWMu‐ exvO.',uc1:'',t:'aa749f01717bd2e29ccacc35701ebef7',unb:'',cna:'y4PeFr/mbEoCAXQZX0Z2u8bq',_t b_token_:'e6163b18b5154',version:'4.0.0'};window.TB && TB.Global && TB.Global.run && TB.Global.run();
    

    淘宝是如何解决分布式Session管理问题呢? 为了解决此问题,淘宝专门推出两个重要产品: 第一个是tbsession, 基于Tair缓存体系实现的共享Session; 另一个是passcookie,解决不同域名之间Cookie 同步的问题,上述的登录鉴权Cookie信息就是通过passcookie实现的统一管理。 淘宝是如何防范Session劫持?
    CSRF/XSRF 攻击的原理,就是利用浏览器对嵌入资源不做限制的行为进行跨站请求伪造攻击, 比如

    SSO登录架构设计

    SSO登录实现流程解析

    1. 用户进入淘宝登录页面,调用地址: https://login.taobao.com/newlogin/login.do
    2. 调用成功之后,同步Cookie,保存Token认证信息。
    3. 访问天猫网站,从Cookie里面拿取Token信息,采用jsonp方式,获取淘宝的登录状态:
    4. 如果不是从淘宝登录, 由天猫发起登录,会请求至淘宝登录页面, 登录完成之后写入Cookie信息, 再返 回至天猫网站。
    展开全文
  • SpringCloud入门 —— SSO 单点登录

    千次阅读 2021-11-29 15:08:24
    单点登录SSO (Single Sign On) 在多个系统中,在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。 单系统登录 在之前我们做的单系统登录,它的...
  • struts2+spring+cas单点登录

    热门讨论 2013-09-13 15:32:22
    使用struts2+spring+cas实现的单点登录功能,里面包括cas-server3.5.2项目一个,cas-client3.2.1 web项目两个,数据库脚本,请按照里面的说明文档进行部署,希望你们也能配置成功。
  • 单点登录(SSO)

    千次阅读 2022-01-20 20:18:08
    什么是单点登录单点登录的来源 单点登录技术实现 Cookie的属性详细介绍 Koa Cookie 的设置与获取 利用Node.js koa异步中间件——用户登录验证拦截器
  • 单点登录实现源码

    2017-11-30 18:07:23
    单点登录实现源码(内含三个工程,一个认证系统+两个子系统) 参考博客 http://blog.csdn.net/qq_23994787/article/details/78678930
  • SSO(单点登录)技术漫谈

    千次阅读 2021-01-10 23:30:33
    在日常工作中,人类为了能进入各个系统,必须得通过帐号和密码进行登录验证(身份验证)后,才能获取到跟自己身份相符的信息。那么问题来了,这么多的系统,每个系统都搞一个密码的话,大多数用户都要记忆不少于10个...
  • 单点登录sso的原理与java实现详细讲解与示例(文档与源码)
  • 实战模拟│单点登录 SSO 的实现

    千次阅读 多人点赞 2022-07-07 17:36:38
    单点登录让你一次性解决多应用认证的繁琐
  • 文章目录一、什么是单点登录二、单点登录原理三、单点登录实现方式1.基于Cookie+Redis的单点登录2.分布式session方式实现单点登录3.token验证4.session广播5.CAS 中央认证服务 一、什么是单点登录 单点登录的英文名...
  • 一、单点登录SSO介绍   目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的...
  • 单点登录详解

    千次阅读 2021-08-27 14:49:30
    一、系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求...
  • web-sso单点登录源码

    热门讨论 2014-10-29 15:14:58
    单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中。本文从业务的角度分析了单点登录的需求和应用领域;从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO和桌面SSO的实现...
  • JWT单点登录

    千次阅读 2021-09-16 14:29:47
    单点登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。 2.2、信息交换 ​ JSON Web Token 是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),...
  • SSO单点登录Java实现实例

    万次阅读 多人点赞 2021-02-05 14:43:44
    本文主要讲解,基于令牌token方式实现,SpringBoot工程下的SSO单点登录整合代码实例Demo,文末附源码地址。 1.环境准备 SSO认证中心服务( www.mysso.com) 客户端1(www.myclient1.com) 客户端2...
  • 分布式Session共享和单点登录实现

    千次阅读 多人点赞 2020-11-09 23:11:41
    文章目录 基于Session的身份认证 简介 实现 分布式Session共享 简介 实现 单点登陆 简介 实现过程 总结 基于Session的身份认证 简介 对于一个Web应用,客户端每次请求时,服务器都会打开一个新的会话,而且服务器...
  • 单点登录说明

    千次阅读 2020-03-13 09:20:02
    什么是单点登录单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分 1、登录  相比于单系统登录,sso...
  • 实现单点登录(SSO)的三种方式

    千次阅读 2022-04-17 22:32:45
    在早期的互联网业务中,一般是使用单一服务器模式。...采用分布式的架构后,为了避免出现用户在一个模块登录后,访问别的模块时还需要重新登录的问题,我们需要使用单点登录(single sign on SSO)的模式来实现用户
  • 单点登录SSO的原理和实现

    千次阅读 2021-11-14 18:15:50
    背景 SSO,英文全称Single Sign On,单点登录,一般应用于多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源。如登录访问 blog.baidu.com 后,对于 edu.baidu.com 也是登录访问。 虽然...
  • 深入浅出单点登录---2、解决方案

    千次阅读 2022-03-11 15:33:23
    用户登录之后, 将认证信息存储至Cookie,当再次访问本服务或者访问其他应用服务时,直接从Cookie中传递 认证信息,进行鉴权处理。 问题 如何保障Cookie内用户认证信息的安全性? 第一, Cookie内不能存放用户名和密码...
  • #1 什么是SSO 零信任理念遵循的“持续验证,永不信任”原则,零信任架构中需要使⽤到的SSO,即单点登录 (Single sign-on) ,是⼀种⾝份验证⽅法。它只需要⽤户使⽤⼀组账号密码或登录凭据,就可以快速、安全地登录多...
  • CAS方式实现单点登录

    千次阅读 2021-11-01 10:51:44
    单点登录,英文是 Single Sign On,缩写为 SSO。 多个站点(192.168.1.20X)共用一台认证授权服务器(192.168.1.110,用户数据库和认证授权模块共用)。用户经由其中任何一个站点(比如 192.168.1.201)登录后,可以免登录...
  • java 单点登录(SSO)

    千次阅读 2020-03-26 18:43:37
    java 单点登录(SSO) 一、背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。 但随着企业的发展,用到的系统随之增多,运营...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 365,489
精华内容 146,195
关键字:

单点登陆