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的输入输出流
Feb 14 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
PHP中$_SERVER的详细参数与说明介绍
Oct 26 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
Apr 23 PHP
Laravel 5框架学习之Laravel入门和新建项目
Apr 07 PHP
PHP+redis实现添加处理投票的方法
Nov 14 PHP
非常重要的php正则表达式详解
Jan 04 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
PHP实现的文件上传类与用法详解
Jul 05 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
利用php实现禁用IE和火狐的缓存问题
2012/12/03 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
php常用正则函数实例小结
2016/12/29 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
Python中的rjust()方法使用详解
2015/05/19 Python
Python中的localtime()方法使用详解
2015/05/22 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
文员岗位职责
2013/11/09 职场文书
初中三好学生事迹材料
2014/01/13 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
十佳青年事迹材料
2014/08/21 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
Redis可视化客户端小结
2021/06/10 Redis