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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
php中sprintf与printf函数用法区别解析
Feb 17 PHP
php动态添加url查询参数的方法
Apr 14 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
PHP截取IE浏览器并缩小原图的方法
Mar 04 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 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
收音机指标测试方法及仪器
2021/03/01 无线电
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
PHP中的替代语法介绍
2015/01/09 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
学习jQuey中的return false
2015/12/18 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
python之Socket网络编程详解
2016/09/29 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
如何给Python代码进行加密
2020/01/10 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
求职推荐信
2013/10/28 职场文书
房屋买卖协议书
2014/04/10 职场文书
投标承诺书怎么写
2014/05/24 职场文书
幸福中国演讲稿
2014/09/12 职场文书
员工辞退通知书
2015/04/17 职场文书
如何写辞职信
2015/05/13 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书