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(6) 面向对象
Feb 16 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
PHP number_format() 函数定义和用法
Jun 01 PHP
thinkphp的c方法使用示例
Feb 24 PHP
2014年10个最佳的PHP图像操作库
Jul 14 PHP
提高php编程效率技巧
Aug 13 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
Jun 19 PHP
PHP入门教程之面向对象基本概念实例分析
Sep 11 PHP
php文件上传、下载和删除示例
Aug 28 PHP
PHP面向对象程序设计OOP继承用法入门示例
Dec 27 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
如何使用php生成zip压缩包
Apr 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 中文和编码判断代码
2010/05/16 PHP
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python文件操作方法详解
2020/02/09 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
高中生家长会演讲稿
2014/01/14 职场文书
英语教学随笔感言
2014/02/20 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
小学运动会开幕词
2015/01/28 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL