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 相关文章推荐
我的论坛源代码(四)
Oct 09 PHP
黑夜路人出的几道php笔试题
Aug 04 PHP
php自定义的格式化时间示例代码
Dec 05 PHP
php中strtotime函数用法详解
Nov 15 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
PHP实现QQ登录实例代码
Jan 14 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
为何说PHP引用是个坑,要慎用
Apr 02 PHP
PHP预定义超全局数组变量小结
Aug 20 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
PHP+JQuery+Ajax实现分页方法详解
2016/08/06 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python中防止sql注入的方法详解
2017/02/25 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
浅析Python pandas模块输出每行中间省略号问题
2018/07/03 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
.NET方向面试题
2014/11/20 面试题
创业计划书的写作技巧及要点
2014/01/31 职场文书
综合实践活动方案
2014/02/14 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL