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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
10条PHP编程习惯助你找工作
Sep 29 PHP
php Try Catch异常测试
Mar 01 PHP
一些php技巧与注意事项分析
Feb 03 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 16 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
Django框架多表查询实例分析
2018/07/04 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
Python的几种主动结束程序方式
2019/11/22 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
幼儿园实习生辞职信
2014/01/20 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
邀请函样本
2015/02/02 职场文书
远程教育培训心得体会
2016/01/09 职场文书
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL