php实现的SSO单点登录系统接入功能示例分析


Posted in PHP onOctober 12, 2016

本文实例讲述了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('<a href="%s">点击登录单点登录系统</a>', SSOlogin::getInstance()->getAuthUrl()));
  }
  $userInfo = SSOlogin::getInstance()->getInfoFromTicket($ticket);
  if (empty($userInfo['username'])) {
    return $this->renderAuthError('请先授权', sprintf('<a href="%s">点击登录单点登录系统</a>', 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程序设计有所帮助。

PHP 相关文章推荐
PHP学习之PHP变量
Oct 09 PHP
php str_pad 函数用法简介
Jul 11 PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
PHP把数字转成人民币大写的函数分享
Jun 30 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP的消息通信机制测试实例
Nov 10 PHP
PHP解压ZIP文件到指定文件夹的方法
Nov 17 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
laravel orm 关联条件查询代码
Oct 21 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 #PHP
基于php实现的php代码加密解密类完整实例
Oct 12 #PHP
php fseek函数读取大文件两种方法
Oct 12 #PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
php 无限分类 树形数据格式化代码
Oct 11 #PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 #PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 #PHP
You might like
自定义PHP分页函数
2006/10/09 PHP
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
php 定义404页面的实现代码
2012/11/19 PHP
php设计模式小结
2013/02/15 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
vue实现放大镜效果
2020/09/17 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
Django权限机制实现代码详解
2018/02/05 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
如何使用python操作vmware
2019/07/27 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
成教自我鉴定
2013/10/27 职场文书
自荐信包含哪些内容
2013/10/30 职场文书
出生医学证明样本
2014/01/17 职场文书
服务员岗位职责
2014/01/29 职场文书
安全教育观后感
2015/06/17 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
毕业班工作总结
2015/08/10 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
如何解决.cuda()加载用时很长的问题
2021/05/24 Python