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
投票管理程序
Oct 09 PHP
linux下 C语言对 php 扩展
Dec 14 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
php增删改查示例自己写的demo
Sep 04 PHP
PHP中strlen()和mb_strlen()的区别浅析
Jun 19 PHP
php实现获取及设置用户访问页面语言类
Sep 24 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
浅谈PHP的反射机制
Dec 15 PHP
laravel-admin的多级联动方法
Sep 30 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
dedecms中使用php语句指南
2014/11/13 PHP
PHP中的类型约束介绍
2015/05/11 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
js继承实现方法详解
2016/12/16 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python_LDA实现方法详解
2017/10/25 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
python中正则表达式与模式匹配
2019/05/07 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
Python爬取梨视频的示例
2021/01/29 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
电钳专业个人求职信
2014/01/04 职场文书
体育专业求职信
2014/07/16 职场文书
会计系毕业求职信
2014/08/07 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS