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中static关键字原理的学习研究分析
Jul 18 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
Aug 18 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
PHP实现图片压缩
Sep 09 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
laravel入门知识点整理
Sep 15 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/10/09 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
Python编程中的文件操作攻略
2015/10/16 Python
django celery redis使用具体实践
2019/04/08 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
社区国庆节活动方案
2014/02/05 职场文书
事务机电主管工作职责
2014/02/25 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
详解Python requests模块
2021/06/21 Python
Python音乐爬虫完美绕过反爬
2021/08/30 Python