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加MYSQL服务器
Oct 09 PHP
mysql中存储过程、函数的一些问题
Feb 14 PHP
PHP字符串处理的10个简单方法
Jun 30 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
gd库图片下载类实现下载网页所有图片的php代码
Aug 20 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
php面向对象重点知识分享
Sep 27 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
Feb 03 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 阴历-农历-转换类代码
2012/01/16 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
如何手写一个简易的 Vuex
2020/10/10 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
跟老齐学Python之集合的关系
2014/09/24 Python
django静态文件加载的方法
2018/05/20 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
python代码实现猜拳小游戏
2020/11/30 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
文明礼仪标语
2014/06/13 职场文书
体育馆的标语
2014/06/24 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
mysql数据库实现设置字段长度
2022/06/10 MySQL