精华内容
下载资源
问答
  • 如何通过php实现SSO单点登录系统接入功能?本文实例讲述了php实现的SSO单点登录系统接入功能。分享给大家供大家参考,具体如下:SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就...

    如何通过php实现SSO单点登录系统接入功能?

    本文实例讲述了php实现的SSO单点登录系统接入功能。分享给大家供大家参考,具体如下:

    SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一,下面我们来看看吧。

    简单讲一下 SSO 单点登录系统的接入的原理,前提是系统本身有完善的用户认证功能,即基本的用户登录功能,那做起来就很方便了。

    SSO 登录请求接口往往是接口加上一个回调地址,访问这个地址会跳转到回调地址并带上一个 ticket 参数,拿着这个 ticket 参数再请求接口可以获取到用户信息,如果存在用户则自动登录,不存在就新增用户并登录。

    比如这个 SSO 模型实现了两个方法,一个是获取接口 url,一个是凭 ticket 获取用户信息:

    interface SSOLogin

    {

    /**

    * 获取登录用户信息

    * @param $ticket

    * @return mixed

    */

    public function getInfoFromTicket($ticket);

    /**

    * 单点登录授权地址

    * @return mixed

    */

    public function getAuthUrl();

    }

    再来看看控制器的主要方法,比如回调地址是跳转到控制器 http://www.example.com/sso/check?ticket=xxxx

    /**

    * 检测是否单点登录

    * @return bool|string

    */

    public function actionCheck()

    {

    $ticket = Yii::$app->getRequest()->get('ticket');

    if (!$ticket) {

    return $this->renderAuthError('请先授权', sprintf('点击登录单点登录系统', SSOlogin::getInstance()->getAuthUrl()));

    }

    $userInfo = SSOlogin::getInstance()->getInfoFromTicket($ticket);

    if (empty($userInfo['username'])) {

    return $this->renderAuthError('请先授权', sprintf('点击登录单点登录系统', SSOlogin::getInstance()->getAuthUrl()));

    }

    $username = $this->getUserName($userInfo['username']);

    $user = User::find()->canLogin()->username($username)->one();

    if (!$user) {

    $newUser = [];

    $newUser['username'] = $userInfo['username'];

    $newUser['email'] = $this->getUserName($userInfo['username']);

    $newUser['role'] = User::ROLE_DEV;

    $newUser['is_email_verified'] = 1;

    $newUser['realname'] = $userInfo['truename'];

    $user = $this->addUser($newUser);

    }

    $isLogin = Yii::$app->user->login($user, 3600 * 24 * 30);

    if ($isLogin) {

    $this->redirect('/task/index');

    }

    return true;

    }

    大概看看这个控制器逻辑就明白了。SSO 接口起到的作用就是获取用户信息,拿这个用户信息跟系统用户表对比,存在用户则进行登录,不存在创建用户并登录。

    这是一个内部的单点系统,集成到后台,可能其他的 SSO 跟这不太一样,但基本原理过程差不多。

    希望本文所述对大家PHP程序设计有所帮助。

    本文地址:http://www.45fan.com/dnjc/84251.html

    展开全文
  • 在使用华丹CHARISMA智能WEB报表快速开发平台开发项目过程中,遇到 一个问题,需要进行SSO单点登录,公司决定使用cas5.3进行构建,下面介绍一下CAS5.3是怎么搭建的 一、 下载CAS5.3 CAS5.3 Server我们下载cas-overlay...

    在使用华丹CHARISMA智能WEB报表快速开发平台开发项目过程中,需要进行SSO单点登录,公司决定使用cas5.3进行构建,下面介绍一下CAS5.3是怎么搭建的,

    cas部署图

    在这里插入图片描述

    cas示意图

    在这里插入图片描述

    一、 下载CAS5.3
    CAS5.3 Server我们下载cas-overlay-template版本
    下载地址:https://github.com/apereo/cas-overlay-template
    打开网址,点击左上角的Branch master可以选择要下载的版本,这里我们下载最新版。
    在这里插入图片描述

    二、编译CAS5.3
    由于cas4.0以上就不再提供release版本,所以需要我们自己编译;我们将下载下来的压缩包放到某个目录下面,通过cmd进入该目录,依据官方文档上的编译方法,我们编译,如下图:

    在这里插入图片描述

    在cmd,运行”build.cmd run”,编译文件,编译时间会比较上,编译完成以后,会在所在目录生成一个target文件夹,如下图:

    在这里插入图片描述

    进入target文件夹,可以看到一个扩展名为.war的文件,如下图:

    在这里插入图片描述

    三、CAS5.3的安装部署
    把步骤二生成的.war文件拷贝到webapps目录下面,启动tomcat,会自动解压缩.解压缩完成以后,通过浏览器http://192.168.1.121:8080/cas/login,如下图:

    在这里插入图片描述

    看到上图表示安装成功。
    四、去除HTTPS
    (1)打开WEB-INF/classess/application.properties,在最下面添加如下代码:
    cas.tgc.secure=false
    cas.serviceRegistry.initFromJson=true
    添加完成以后,如下图:

    在这里插入图片描述

    (2)打开WEB-INF/classess/services/HTTPSandIMAPS-10000001.json,如下图:
    在这里插入图片描述

    修改为如下图:

    在这里插入图片描述

    如果不加上图的proxyPolicy节点,总是报一下错误

    在这里插入图片描述

    疑问:谁要知道原因的话,告诉我一下
    至此CAS Server5.3配置完成。
    五、CAS 5.3测试
    (1)首先通过浏览器访问http://192.168.1.121:8080/cas/login,输入账号、密码(casuser/Mellon);如下图:

    在这里插入图片描述

    (2)启动Cas Net Client,如下图:

    在这里插入图片描述

    (3)点击左上角的”Authenticated Users Only”,跳转到认证中心,在认证中心输入账号与密码,点击登录,登录成功,调整到Client页面,如下图:

    在这里插入图片描述

    (4)点击左上角的”Home”,返回到主页面,显示认证信息,如下图:

    在这里插入图片描述

    至此Cas Server5.3搭建完毕。
    六、大家过程中碰到的问题
    启动客户端,跳转到认证中心,登录成功以后,在客户端验证时,总是返回”INVALID_PROXY_CALLBACK”,所提供的代理回调网址不能提供认证,如下图:

    在这里插入图片描述

    搜索了好久才找到了解决方法,解决方法是修改WEB-INF/classes/services/HTTPSandIMAPS-10000001.json,添加proxyPolicy节点,如下图:

    在这里插入图片描述
    上述就是cas搭建过程,华丹智能WEB报表快速开发平台的确很好用,能够自由扩展其他组件,有兴趣也可以看一下,网址https://www.huadaninfo.com/

    搭建步骤参考:https://blog.csdn.net/u011872945/article/details/81047025

    展开全文
  • 文章目录前言实现流程登录服务器`sso.com`登录页 `client1.com`客户端成功页面 前言 很早期的公司,一家公司可能只有一个Server,慢慢的Server开始变多了。...接下来就实现单点登录的功能。 流程图 实现 开源s


    前言

    很早期的公司,一家公司可能只有一个Server,慢慢的Server开始变多了。每个Server都要进行注册登录,退出的时候又要一个个退出。用户体验很不好!你可以想象一下,上豆瓣 要登录豆瓣FM、豆瓣读书、豆瓣电影、豆瓣日记…真的会让人崩溃的。我们想要另一种登录体验:一家企业下的服务只要一次注册,登录的时候只要一次登录,退出的时候只要一次退出。怎么做?

    接下来就实现单点登录的功能。

    流程图
    在这里插入图片描述

    实现

    开源sso的项目:https://gitee.com/xuxueli0323/xxl-sso

    流程

    1. 给登录服务器留下痕迹
    2. 登录服务器要将token信息重定向的时候,带到url地址上
    3. 其他系统要处理url地址上的token,只要有将token对应的用户保存到自己的session
    4. 自己系统将用户保存在自己的session中

    server:登录服务器、8080 、sso.com
    web-sample1:项目1 、8081 、client1.com
    web-sample2:项目1 、8082 、client2.com

    假设发送这一个请求 sso.com:8080/login.html?redirect_url=http://client1.com:8081/employees

    登录服务器sso.com

        @GetMapping("/login.html") 
        //正常来说是调用服务而不是在参数填写返回地址的,为了图方便就这样了
        public String loginPage(@RequestParam("redirect_url") String url, Model model, @CookieValue(value = "sso_token", required = false) String sso_token 
        //获取浏览器session信息) {
        
            //判断浏览器是否有登录痕迹
            if (!StringUtils.isEmpty(sso_token)) {
                return "redirect:" + url + "?token=" + sso_token;
            }
            //无痕迹返回
            model.addAttribute("url", url);
    
            return "login";
        }
        
       @PostMapping(value = "/doLogin")
        public String doLogin(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("redirect_url") String url, HttpServletResponse response) {
    
            //登录成功跳转
            if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
    
                String uuid = UUID.randomUUID().toString().replace("_", "");
                //保存痕迹
                redisTemplate.opsForValue().set(uuid, username);
                //保存痕迹的坐标
                Cookie sso_token = new Cookie("sso_token", uuid);
    
                response.addCookie(sso_token);
                //登录成功跳转新地址带上保存痕迹的坐标
                return "redirect:" + url + "?token=" + uuid;
            }
            //登录失败跳回到登录页
            return "login";
        }
        
        @ResponseBody
        @GetMapping("/userinfo") 获取保存的痕迹
        public String userinfo(@RequestParam(value = "token") String token) {
        	//获取保存的痕迹
            String s = redisTemplate.opsForValue().get(token);
    
            return s;
    
        }
    

    登录页

    <form action="/doLogin" method="post">
        用户名:<input type="text" name="username" /><br />
        密码:<input type="password" name="password" /><br />
         <!--无痕迹登录所携带地址-->
        <input type="hidden" name="redirect_url" th:value="${url}" />
        <input type="submit" value="登录">
    </form>
    

    客户端client1.com

     @GetMapping(value = "/employees")
        public String employees(Model model, HttpSession session, @RequestParam(value = "token", required = false) String token) {
       		 //拥有痕迹
            if (!StringUtils.isEmpty(token)) {
                RestTemplate restTemplate=new RestTemplate();
                //发送请求通过痕迹的坐标获取痕迹内容
                ResponseEntity<String> forEntity = restTemplate.getForEntity("http://sso.com:8080/userinfo?token=" + token, String.class);
                String body = forEntity.getBody();
                
                将痕迹保存到session中
                session.setAttribute("loginUser", body);
            }
            Object loginUser = session.getAttribute("loginUser");
    
    		判断痕迹是否存在
            if (loginUser == null) {
    
                //没有就跳回登录页面
                return "redirect:" + "http://sso.com:8080/login.html"+"?redirect_url=http://localhost:8081/employees";
            } else {
    
                List<String> emps = new ArrayList<>();
    
                emps.add("张三");
                emps.add("李四");
    
                model.addAttribute("emps", emps);
                return "employees";
            }
        }
    

    成功页面

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>员工列表</title>
    </head>
    <body>
    <h1>欢迎:[[${session.loginUser}]]</h1>
    <ul>
        <li th:each="emp:${emps}">姓名:[[${emp}]]</li>
    </ul>
    </body>
    </html>
    

    以上流程走通以后已经给浏览器留下了痕迹
    在这里插入图片描述

    就算再来一个客户端来访问也会因为登录服务器的判断而直接去往成功页面,实现了单次登录的效果!!!

            //判断浏览器是否有登录痕迹
            if (!StringUtils.isEmpty(sso_token)) {
                return "redirect:" + url + "?token=" + sso_token;
            }
            //无痕迹返回
            model.addAttribute("url", url);
    
            return "login";
        }
    

    通过session和类似令牌机制来实现这功能的思想确实很牛啊,当然大型业务就没那么简单了…

    展开全文
  • 继上篇《实现SSO单点登录的思考》当我们写好SSO单点登录服务的代码后,通过调用接口方式验证,流程看似正常,但开始与前端联调就出现问题了。流程是这样的:前端在首页使用ajax访问后端获取菜单或者用户信息的接口,...
    54521e7c4451e995dcc34571cdfc2aaf.png关注 “Java艺术” 我们一起成长!继上篇《实现SSO单点登录的思考》当我们写好SSO单点登录服务的代码后,通过调用接口方式验证,流程看似正常,但开始与前端联调就出现问题了。流程是这样的:前端在首页使用ajax访问后端获取菜单或者用户信息的接口,以触发登录校验,如果未登录则重定向到SSO登录页面。但这一步就出问题了,原因是ajax无法拦截302处理。当ajax接收到302响应时,看起来就像是ajax直接向重定向链接发起请求,而不是让浏览器重定向,结果啥事也没干。关于ajax无法拦截302处理的原因,笔者从网上找到的解释如下。

    服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向,从响应头中读取Location信息,然后向Location中的Url发出请求,在收到这个请求的响应后才会进行ajax回调处理。

    大致流程:ajax -> browser -> server -> 302 -> browser(redirect) -> server -> browser -> ajax callback

    原本是为了让前端以最少的改动接入SSO,但因为笔者对前端的了解较浅,才犯了这样的错误。既然ajax无法处理302,那也只能修改流程,让前端主动发起重定向了。流程修改后,当后端验证用户未登录或登录过期时响应401状态码,同时body给出重定向链接,而前端需要全局拦截401错误,从响应body获取链接并让浏览器重定向到指定链接,该链接就是由后端拼接好的跳转到SSO登录的链接。bc9a19979ab44a6fcd0eeb68c558d81d.png最后还有一个cookie问题。由于本地测试,前端将请求转发给部署到测试环境的后端,前端的域名为127.0.0.1,后端测试环境域名为xxx. com,导致本地测试跳转到SSO登录成功并返回后,前端向后端发起请求依然响应401。原因在上篇已经描述过了,就是因为域名不同,前端使用ajax发起请求,浏览器并不会将xxx.com域名下的cookie带上,只会带上127.0.0.1域名下的cookie。解决该问题只需要修改传给SSO登录成功后重定向的checkToken接口的域名为前端本地测试的域名,由前端将请求转发给后端,或者在nginx配置将此接口的请求转发给后端处理,只有这样session才能保持一致。除此之外,跨协议无法重订向。也就是说,sso部署在测试环境域名为https://sso.xx.com,而接入sso的服务在本地测试域名为http://127.0.0.1,想要从https://sso.xx.com登录成功后重定向回http://127.0.0.1是不支持的,原因是跨协议重定向了,由https协议变成了http协议。从这些事情可以看出,实战很重要!即便理解了流程、实现原理,但不动手实战就学不到细节,无法从各种踩坑过程中成长。e843b8cfa3f8af7d0b1e729b2e303b20.png[Java艺术] 微信号:javaskill一个只推送原创文章的技术公众号,分享Java后端相关技术。
    展开全文
  • 基于JWT实现SSO单点登录1 single sign on(SSO) 的效果是什么? 如上图: 用户在应用a触发了登录,那么a会拿到一个jwt信息 用户在应用b不用登录,会发现已经登录过了?然后返回一个jwt给应用b。完成应用b的登录 ...
  • 慕课网上边是用的status2,因为现在很少有项目使用status2了,基本都会使用springmvc所以自己就试着改了一下废话不多说,想明白怎么实现的自己去慕课网学习搜java实现单点登录就可以看到,这里我只贴出来代码以便...
  • 关于sso单点登录问题

    2017-04-27 09:40:23
    最近要做一个sso整合子系统。 ...2.如果放在sso认证系统,那么sso系统里面应该怎么实现不同表的查询登录。 3.每个子系统的登录角色、登录权限、登录用户不一样,需要查询的表也不一样,怎么考虑。
  • 简单说一下我的逻辑,我也不知道我理解sso对不对。 假如三个站点 a.baidu.com b.baidu.com c.baidu.com a.baidu.com 作为验证用户登录账户。 b和c作为客户端(子系统)。 b和c需要登录的时候跳转到a,并且携带参数...
  • 假如在微服务中使用JWT实现单点登录,一般都会有一个认证中心(也就是登录服务中心),主要是用来验证用户账号密码是否合法,如果合法就生成JWT token值转递给前端。这样的话,前端只要调用接口只要携带这个JWT ...
  • 之前写过一篇文章,即关于P6SSO:https://blog.csdn.net/kping163/article/details/95167405,其实讲的就是P6单点登录,但或许有些朋友不是很理解,这里再简单介绍下怎么配置: 以下过程无需借助OIM/OAM套件,只是...
  • 首先,在搞代码之前,我们要了解什么是JWT? 这个一开始我也不太明白,后来经过百度阅读看了很多文章才明白,其实JWT就像一个工具,可以对字符串进行签名...当用户登录成功时,将Token放在Redis,同时设置该Red...
  • ​mp.weixin.qq.com扫码关注公众号【爪哇优太儿】所谓单点登录就是在A系统登录以后,跳转到B系统,此时可以直接访问B系统的资源,而不需要二次登录,目前这种需求已经非常普遍了,那么背后是怎么实现的呢?...
  • 基于Oauth2,springsecurity单点登录SSO,前后端分离和SPA方式实现方式。 在接到需求要做SPA方式的单点登录的需求,发现好多的坑,之前我们接触的只是浏览器的单点登录,基于session的或者是基于app的基于token的,...
  • 所谓单点登录就是在A系统登录以后,跳转到B系统,此时可以直接访问B系统的资源,而不需要二次登录,目前这种需求已经非常普遍了,那么背后是怎么实现的呢?本文将用一个实际的例子来给大家详细的讲解下。 准备工作 ...
  • 有网友问起, 前后端分离 架构下的 Web 单点验证 怎么做, 我画了个图 : ...Web 单点登录 都可以用这个 模型, 不仅仅是 前后端分离 。 转载于:https://www.cnblogs.com/KSongKing/p/10246662.html...
  • 单点登录,比如www.aaa.com,www.bbb.com两个网站,要实现aaa登录后,bbb网站也实现登录这两天网上查看了挺多资料基本都说使用用户验证中心,设置ticket,我实施了下,通过P3P跨站传COOKIE,但是怎么验证这个cookie的...
  • 子系统的统一认证交给SSO来解决,这样可以实现一处登录后,登录其他系统后就不需要再次输入账号密码。下面记录一下自己的实现逻辑,代码以后有空补充。 设置全局拦截器 ...至于怎么访问SSO系统,可以配置...
  • SSO~~~单点登录

    2020-08-27 15:46:55
    当用户登录时,通过nginx访问jt-web中任意的服务器之后输入用户名和密码访问jt-sso单点登录服务器 获取用户的登录信息查询数据库,校验用户名和密码是否正确,如果用户名和密码是正确的,将用户信息转化为JSON串,...
  • 注意:没有cas.war的话我上一篇文章已经介绍怎么做cas.war啦。 链接: (2)把之前github下载的cas项目中的cas.properties文件复制过来 (3)修改文件配置文件 修改该路径为刚才你复制过来的cas....
  • BS单点登录(SSO)

    2018-05-04 20:25:00
    有个B/S项目,是作为...一开始没概念啊,什么是单点登录(SSO)啊。大概有个概念后,怎么实现啊。给的文档中的例子是用Java的,而我们的Web应用是用Asp.Net实现的。最后是总算弄明白怎么做了,记录一下相关的过程。...
  • Web 端单点登录(Single Sign On,简称 SSO)很常见,是目前比较流行的企业业务整合的解决方案之一。 SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。我们该怎么实现呢?先来看...
  • SSO系统在公司一般是独立部署的一套系统,需要各业务系统接入,回想一下之前传统系统都是业务+登录一体化,那个时候,我们可以将用户信息保存到session,那如果是微服务+独立SSO怎么实现各系统session共享的问题?...
  • 多系统-单点登录一 ....下载xxl-sso单点登录框架, 一 .多系统登录-单点登录 1.介绍 1.1).描述 谷粒商城的微博、账号登录 ,是单系统登录。怎么实现一次登录,多系统使用? 1.2).下载xxl-sso单点登录框架, ...
  • 1.前提:需要做一个单点登录,使用asp.net自带的表单验证(FormsAuthentication)配置文件怎么写,如下(基本的):enableCrossAppRedirects:是否跨应用程序使用name:指定验证通过后写到浏览器的cookie名称,同时验证...
  • 什么是单点登录 1.1.session存了什么? 1.2.浏览器同源策略 1.3.session共享与session复制(不可用方案) 1.4 session复制到session不复制| 1.5.跨域访问2.SpringSession+redis 3. token(一串字符串) 3.1 token...
  • 最近新参与的项目用到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了一个spring-boot 集成CAS 的demo。实现单点登录与登出。 单点登录英文全称是:Single Sign On,简称SSO。 含义:在多个相互信任的...
  •  需要做一个单点登录,使用asp.net自带的表单验证(FormsAuthentication)  配置文件怎么写,如下(基本的): <authenticationmode="Forms"> <formsloginUrl="~/user/login"enableCrossAppRedirects=...
  • 网站通行证方案-单点登录SSO

    千次阅读 2007-10-25 09:37:00
    记得曾经网站通行证开发是很热门的话题,最近正好有了解到相关的, 和大家谈谈我所了解的单点登录怎么实现的。单点登录即几个不同网站(CP应用)只要在一个地方登录就在所有其它网站同时登录了。首先我们要一个SSO...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
关键字:

怎么实现sso单点登录