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采集利器 Snoopy 试用心得
Jul 03 PHP
检查用户名是否已在mysql中存在的php写法
Jan 20 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
php数组键值用法实例分析
Feb 27 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
php遍历解析xml字符串的方法
May 05 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 PHP
PHP7 错误处理机制修改
Mar 09 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/12/13 PHP
PHP时间戳使用实例代码
2008/06/07 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
python的mysqldb安装步骤详解
2017/08/14 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
电脑售后服务承诺书
2014/03/27 职场文书
综合实践活动总结
2014/05/05 职场文书
校园标语大全
2014/06/19 职场文书
代办出身证明书
2014/10/21 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS