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安装全攻略:APACHE
Oct 09 PHP
深入理解PHP原理之异常机制
Aug 21 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
php木马webshell扫描器代码
Jan 25 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
浅析PHP 按位与或 (^ 、&amp;)
Jun 21 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
PHP中is_dir()函数使用指南
May 08 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
php递归函数怎么用才有效
Feb 24 PHP
Laravel框架中缓存的使用方法分析
Sep 06 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 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
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
php实现倒计时效果
2015/12/19 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
IE和Firefox下event事件杂谈
2009/12/18 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
jquery对表单操作2
2011/04/06 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
详解Angular4 路由设置相关
2017/08/26 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
python错误处理详解
2014/09/28 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
《画家乡》教学反思
2014/04/22 职场文书
法学专业求职信
2014/07/15 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
可怜妈妈观后感
2015/06/09 职场文书
歌舞青春观后感
2015/06/10 职场文书
毕业证明书
2015/06/19 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
Python实现排序方法常见的四种
2021/07/15 Python
Kubernetes控制节点的部署
2022/04/01 Servers